Почему ** не находит ** найти ничего?

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

$ find /usr -name *.sh

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

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

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

20.08.2008 21:03:54
Это вопрос SuperUser?
endolith 8.11.2009 01:44:11
Это лучше подходит для UnixSE
Richard de Wit 17.12.2015 10:17:21
3 ОТВЕТА
РЕШЕНИЕ

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

$ 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'
52
20.08.2008 21:04:01
Что делать, если файл является сценарием оболочки, но не имеет .shрасширения? Может быть что-то подобное find /xyz | xargs file | grep shell?
Paul Ratazzi 14.12.2015 17:52:12
Однако как часто сценарии оболочки не имеют расширения .sh?
user4822346 16.12.2015 19:43:46
Есть ли какой-нибудь общий способ выяснить, когда / где расширяется подстановочный знак?
isaacg 21.12.2015 09:51:50
Ну, когда я вырос в Windows, где все имеет расширение, я видел довольно много сценариев на * ix, пропуская это.sh
Jan 21.12.2015 19:29:00

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

find /usr -name '*.foo' -print
15
26.08.2008 17:49:06
Я был немного этим в прошлом. Но я должен отметить, что на современной коробке Solaris опция -print включена по умолчанию. На самом деле, я не могу найти находку, которая больше не работает таким образом.
Jon Ericson 8.09.2008 22:49:33

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

locate '/usr*.sh'
7
5.09.2014 04:09:31
Прекрасное предложение. (Мне пришлось запустить updatedb на моей машине, чтобы проверить идею, так как по какой-то причине у меня ее нет в crontab. Основная причина не использовать locate
Jon Ericson 27.01.2009 18:39:51
И есть несколько систем, в которых по умолчанию не установлено locate - я обнаружил, что должен был установить mlocateпакет на моем Raspberry Pi - не забывая sudo updatedbвпоследствии о создании индексов ...
SlySven 24.12.2015 22:33:51