По какой-то причине я хотел бы удалить все файлы с именами типа "* .jpg?" (имя файла заканчивается на настоящий?)
Я пробовал это
find /var/www/ -type f -name "*.jpg\?"
и
find /var/www/ -type f -name "*.jpg?"
но это не работает, как я могу это сделать?
Интересно, что обе ваши команды работают в системе CentOS 6.5 find 4.4.2, которую я должен передать. Вы можете попробовать использовать одинарные кавычки '
find /var/www/ -type f -name '*.jpg?'
Если это работает и доступно в вашем find, вы можете использовать аргумент -delete, чтобы найти, чтобы удалить файлы. Это избавляет от необходимости использовать xargs, print0 и тому подобное. Убедитесь, что команда find работает правильно, прежде чем добавлять удаление.
Короткий ответ:
find /var/www -type f -name '*.jpg\?'
Пояснение:
?
имеет особое значение в большинство снаряды. Это подстановочный знак «односимвольный».
В оболочке это означает, что он будет расширяться до любого символа, как и *
расширяется до любой строки:
> echo *
1file 2file dir1 dir2 file1 file2
> echo ?
?
> echo file?
file1 file2
Имейте в виду, что эти специальные символы будут расширены вашей оболочкой, а не командой, которой вы передаете их в качестве аргументов.
В конкретном случае find
, find
также принимает подстановочные знаки. Таким образом, вы иметь чтобы сбежать от них на оболочке, чтобы найти их.
Позвольте мне пояснить это на другом примере:
> echo *
dir1 file1 file2
> find dir1 -name *
find: paths must precede expression: file1
> find dir1 -name \*
dir1
dir1/test1
dir1/test2
> find dir1 -name '*'
dir1
dir1/test1
dir1/test2
Если я не сбегу *
, find
получит ту же строку, что и echo
показал вместо *
Как видите, специальные символы можно экранировать с помощью обратной косой черты или заключить их в '
одинарные кавычки. Я предпочитаю одинарные кавычки по многим причинам. (Обратите внимание, что это относится к bash, dash и, возможно, другим, но, вероятно, не ко всем).
Теперь вы избежали ?
из оболочки, но не из находки. Обычно это не вызывает проблем, но может, если, например, у вас есть файл file.jpga
вы не хотите удалять:
> find . -type f -name '*.jpg?'
./file1.jpg?
./file2.jpga
> find . -type f -name '*.jpg\?'
./file1.jpg?
Другой выбор был бы find . -type f -name \*.jpg\\\?
... теперь вы понимаете, почему я предпочитаю одинарные кавычки.