Линукс командной строки найти 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\\\?... теперь вы понимаете, почему я предпочитаю одинарные кавычки.

Другие вопросы по тегам