Линукс командной строки найти escape-вопросительный знак
По какой-то причине я хотел бы удалить все имена файлов, такие как "*.jpg?" (имя файла заканчивается реальным?)
Я пробовал это
find /var/www/ -type f -name "*.jpg\?"
а также
find /var/www/ -type f -name "*.jpg?"
но это не работает, как я могу это сделать?
2 ответа
Интересно, что обе ваши команды работают в системе CentOS 6.5 find 4.4.2, которую я должен передать. Вы можете попробовать использовать одинарные кавычки '
find /var/www/ -type f -name '*.jpg?'
Если это работает, и это доступно в вашей находке, вы можете использовать аргумент -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\\\?
... теперь вы понимаете, почему я предпочитаю одинарные кавычки.