Почему ** не находит ** ничего найти? - PullRequest
17 голосов
/ 21 августа 2008

Я ищу файлы сценариев оболочки, установленные в моей системе, но find не работает:

$ find /usr -name *.sh

Но я знаю, что существует множество сценариев. Например:

$ ls /usr/local/lib/*.sh
/usr/local/lib/tclConfig.sh  
/usr/local/lib/tkConfig.sh

Почему не находит работу?

Ответы [ 3 ]

52 голосов
/ 21 августа 2008

Попробуйте использовать подстановочный знак:

$ find /usr -name \*.sh

или

$ find /usr -name '*.sh'

Если в текущем рабочем каталоге есть файл, который соответствует *. Sh , подстановочный знак будет расширен до того, как find его увидит. Если в вашем рабочем каталоге есть файл с именем tkConfig.sh, команда find будет расширена до:

$ find /usr -name tkConfig.sh

, который будет искать только файлы с именем tkConfig.sh. Если у вас есть более одного файла, который соответствует *. Sh , вы получите синтаксическую ошибку от find :

$ 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 обычно не следует по ссылкам, поэтому вам может понадобиться опция -follow :

$ find /usr -follow -name '*.sh'
15 голосов
/ 21 августа 2008

В некоторых системах (например, Solaris) действие по умолчанию отсутствует, поэтому необходимо добавить команду -print.

find /usr -name '*.foo' -print
7 голосов
/ 25 января 2009

Для поиска файлов на ваших дисках используйте «locate» вместо мгновенного (заглядывает в ежедневный индекс) Ваш пример будет:

locate '/usr*.sh'
...