В этой команде:
find . -name \*.pyc -delete
Зачем нужна обратная косая черта перед *.pyc
?
Глобус без кавычек будет расширен оболочкой перед выполнением find
. (См. Расширение имени файла в руководстве.)
Сказав так:
find . -name *.pyc -delete
будет на самом деле выполнить:
find . -name file1.pyc file2.pyc file3.pyc -delete
при условии, что в текущем каталоге было 3 файла .pyc, что привело к ошибке.
Обратная косая черта заставляет оболочку передавать глобус, чтобы find
, то есть она действует так, как если бы *.pyc
был заключен в кавычки.
В идеале вы должны цитировать глобус:
find . -name '*.pyc' -delete
Прежде чем ваша оболочка выполнит команду find
, она выполнит различные расширения. При этом он также обрабатывает специальные символы (или символы со специальным значением), где *
- это подстановочный знак - символ-заглушка. Это так называемое расширение имени файла.
Скажем, у вас есть два файла в вашем каталоге:
foo.pyc
bar.pyc
Тогда *.pyc
расширится до обоих имен. Так что если вы напишите:
find . -name *.pyc -delete
тогда оболочка на самом деле вызовет:
find . -name foo.pyc bar.pyc -delete
что не имеет большого смысла, потому что вы можете иметь только один аргумент для -name
. Вот почему вам нужно экранировать специальный символ, чтобы не допустить его интерпретации оболочкой. Вы делаете это путем экранирования обратной косой черты или, в качестве альтернативы, цитируя его.