Команда find в оболочке bash и опция -name сомневаются - PullRequest
3 голосов
/ 15 апреля 2011

В чем разница между двумя приведенными ниже:

find . -type f -name \*.bmp
find . -type f -name *.bmp 

Я тестировал, они оба возвращают один и тот же результат, поэтому есть ли что-то другое _deep inside_?


Добавлено из удаленного ответа :

Таким образом, следует избегать расширения оболочки для специального символа *****, передавая только * в качестве аргумента команде поиска и позволяя ей обрабатыватьit.

Но на моей машине все они хороши, оба возвращают файлы bmp в текущую директорию и ниже, если назвать несколько, результат как ниже, некоторые опущены для краткости

./images/building_color.bmp
./images/building_gray.bmp
./images/car_gray.bmp
./images/temple_color.bmp
./images/boat_gray.bmp
./images/tools_gray.bmp
./images/temple_gray.bmp
./images/tools_color.bmp
./images/car_color.bmp
./images/boat_color.bmp

информация о системе:

GNU bash, версия 4.1.5 (1) -релиз (i486-pc-linux-gnu)

Linux sysabod-ноутбук 2.6.32-30универсальный # 59-Ubuntu SMP Вт 1 марта 21:30:21 UTC 2011 i686 GNU / Linux

Ответы [ 3 ]

7 голосов
/ 15 апреля 2011

Вот как они отличаются: первый всегда работает, а второй - нет.

Почему: в bash глобусы оболочки (шаблоны подстановки, включая * или?) Расширяются наоболочка во все файлы, соответствующие глобусу.Однако, если таких файлов не существует, шаблон остается один.

Итак, если вы находитесь в каталоге без файлов bmp, команды работают так же, потому что первый экранируется и bashне удается найти файлы, совпадающие во втором случае.

Если вы запустили его из каталога, содержащего только один такой файл, скажем foo.bmp, первый найдет все файлы bmp в поддереве, тогда каксекунда найдет все файлы только с именем foo.bmp.Если запустить в каталоге с несколькими bmp файлами, я думаю, вы получите ошибку, потому что find не знает, что делать со всеми именами файлов.

3 голосов
/ 15 апреля 2011

Когда вы экранируете звездочку (\*), сама звездочка передается в качестве аргумента команде find и будет оцениваться как find. Если вы не экранировали звездочку (*), оболочка уже оценила ее и расширила до имен файлов, соответствующих шаблону.

Для примера рассмотрим следующую структуру каталогов:

./a.txt
./b.bmp
./c.bmp
./dir/d.doc
./dir/e.bmp

Когда вы выполните

find . -type f -name *.bmp

оболочка расширяется *.bmp до b.bmp c.bmp. То есть фактически выполненная команда будет:

find . -type f -name b.bmp c.bmp

, который найдет b.bmp и c.bmp, но не dir/e.bmp.

Когда вы выполните

find . -type f -name \*.bmp

*.bmp передается напрямую как find. find будет проходить через текущий каталог (.) и все его подкаталоги (только в примере dir) и найдет все файлы в этих каталогах, соответствующих шаблону. Результат будет: b.bmp, c.bmp, а также dir/e.bmp.

2 голосов
/ 15 апреля 2011

Первая команда:

find . -type f -name \*.bmp

передает звездочку команде find, и это говорит ей найти все файлы в текущем каталоге и ниже, заканчивающемся .bmp .

Вторая команда:

find . -type f -name *.bmp

может быть разрешена оболочкой, например:

find . -type f -name image1.bmp image2.bmp image3.bmp

(это будут файлы bmp втолько текущий каталог)

и find будут только перечислять их, не файлы bmp в других каталогах ниже текущего .

...