Назад | Перейти на главную страницу

командная строка linux найти escape-знак вопроса

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