Команда bash find отказывается найти более одного файла с подстановочными знаками - PullRequest
2 голосов
/ 02 марта 2012

Мой find работает не так, как я ожидал. Когда существует более одного файла, он останавливается с ошибкой.

hpek@melda:~/temp/test$ ll
total 16
-rw-r--r--  1 hpek  staff    70B Mar  2 15:16 f1.tex
-rw-r--r--  1 hpek  staff    70B Mar  2 15:17 f2.tex
hpek@melda:~/temp/test$ find . -name *.tex 
find: f2.tex: unknown option
hpek@melda:

и если я удалю один из файлов, он будет работать:

hpek@melda:~/temp/test$ rm f1.tex 
hpek@melda:~/temp/test$ find . -name *.tex 
./f2.tex
hpek@melda:~/temp/test$ 

Неважно, какой файл я удаляю. Как только шаблон подает более одного файла, find останавливается.

Ответы [ 4 ]

6 голосов
/ 02 марта 2012

*.tex раскрывается командой bash перед отправкой в ​​качестве аргумента команды.

find . -name *.tex

в вашем случае эквивалентно

find . -name f1.tex f2.tex

Решение: Поместите "..." вокруг аргументов с подстановочными знаками, чтобы избежать расширения оболочки:

find . -name "*.tex"

Это будет работать как ожидалось:

$ find . -name "*.tex"
./f1.tex
./f2.tex
4 голосов
/ 02 марта 2012

Вы должны указывать символы подстановки, чтобы bash не расширял их:

find . -name '*.tex'

Сейчас * интерпретируется bash.В результате это фактически выполняемая команда:

find . -name f1.tex f2.text
3 голосов
/ 02 марта 2012

Ваш подстановочный знак * расширяется оболочкой до достижения команды find. Другими словами, вот команда, выполняемая find:

find . -name f1.tex f2.tex

Обратите внимание, что если вы выполните команду из другого каталога, вы получите другие результаты, поскольку подстановочный знак будет расширен по-разному.

Чтобы получить желаемый результат, попробуйте экранировать его следующим образом:

find . -name \*.tex 
2 голосов
/ 02 марта 2012

Вместо этого вы хотите find . -name "*.tex" - обратите внимание на кавычки вокруг шара.Здесь происходит то, что в вашем случае ваша оболочка расширяет глобус и затем передает результат этого для поиска, что приводит к find . -name f1.tex f2.tex - что является недопустимым способом использования find.

Byпомещая аргумент в кавычки, его передают, чтобы найти как есть.

...