Почему **find** ничего не находит?
Вопрос
Я ищу файлы сценариев оболочки, установленные в моей системе, но Найти не работает:
$ find /usr -name *.sh
Но я знаю, что существует масса сценариев.Например:
$ ls /usr/local/lib/*.sh
/usr/local/lib/tclConfig.sh
/usr/local/lib/tkConfig.sh
Почему бы и нет Найти работать?
Решение
Попробуйте использовать подстановочный знак в кавычках:
$ find /usr -name \*.sh
или:
$ find /usr -name '*.sh'
Если у вас случайно есть файл, который соответствует *.ш в текущем рабочем каталоге подстановочный знак будет расширен до того, как его увидит find.Если у вас случайно есть файл с именем tkConfig.sh в вашем рабочем каталоге, Найти команда расширилась бы до:
$ find /usr -name tkConfig.sh
который находил бы только файлы с именами tkConfig.sh.Если у вас было более одного файла, который соответствует *.ш, вы бы получили синтаксическую ошибку от Найти:
$ cd /usr/local/lib
$ find /usr -name *.sh
find: bad option tkConfig.sh
find: path-list predicate-list
Опять же, причина в том, что подстановочный знак распространяется на оба файла:
$ find /usr -name tclConfig.sh tkConfig.sh
Использование подстановочного знака в кавычках предотвращает его преждевременное расширение.
Другая возможность заключается в том, что /usr или один из его подкаталогов является символической ссылкой. Найти обычно не переходит по ссылкам, поэтому вам может понадобиться -следовать вариант:
$ find /usr -follow -name '*.sh'
Другие советы
В некоторых системах (например, Solaris) действие по умолчанию отсутствует, поэтому вам нужно добавить команду -print .
find /usr -name '*.foo' -print
Для поиска файлов на ваших дисках используйте вместо этого "locate", который выполняется мгновенно (просматривает ежедневный встроенный индекс) вашим примером может быть:
locate '/usr*.sh'