Почему обратная косая черта перед звездочкой в ​​`find`?


9

В этой команде:

find . -name \*.pyc -delete

Почему обратная косая черта нужна раньше *.pyc?


Страница man для findсправочника должна иметь раздел, называемый NON-BUGSчем-то похожим в качестве примера, и объяснение, почему это необходимо.
Брайан,

Ответы:


19

Глобус без кавычек будет расширен оболочкой перед findвыполнением. (См. Расширение имени файла в руководстве.)

Сказав так:

find . -name *.pyc -delete

будет на самом деле выполнить:

find . -name file1.pyc file2.pyc file3.pyc -delete

при условии, что в текущем каталоге было 3 файла .pyc, что привело к ошибке.

Обратная косая черта заставляет оболочку передавать глобус find, т.е. она действует так, как если бы она *.pycбыла заключена в кавычки.

В идеале вы должны цитировать глобус:

find . -name '*.pyc' -delete

@RamRachum, но больше символов при наборе текста.
Пол Дрейпер

1
@PaulDraper Удобочитаем и меньше подвержен ошибкам> Короче одним нажатием клавиши
дверная ручка

Одиночные кавычки - это путь. Я даже не думал, что ты сможешь использовать обратную косую черту таким образом ...
Флорис,

4

Прежде чем ваша оболочка findвыполнит команду, она выполнит различные расширения . При этом он также обрабатывает специальные символы (или символы со специальным значением), где *используется подстановочный знак - символ-заглушка. Это так называемое расширение имени файла.

Скажем, у вас есть два файла в вашем каталоге:

  • foo.pyc
  • bar.pyc

Тогда *.pycрасширился бы на оба имени. Так что если вы напишите:

find . -name *.pyc -delete

тогда оболочка на самом деле вызовет:

find . -name foo.pyc bar.pyc -delete

что не имеет большого смысла, потому что вы можете иметь только один аргумент для -name. Вот почему вам нужно экранировать специальный символ, чтобы предотвратить его интерпретацию оболочкой. Вы делаете это, убирая обратную косую черту или, наоборот, цитируя его.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.