дикие карты на находке и ls

Я пытаюсь выяснить wild-cards для работы с файлами.

У меня есть эти файлы в каталоге для тестирования:

file_BSD.GIF  file_linux.gif  file_unix

См. Мою команду ls,

$ ls *{.GIF,.gif}
file_BSD.GIF  file_linux.gif

Это нормально.

Но "найти" похоже не работает одинаково:

$ find -name *{.GIF,.gif}
find: paths must precede expression: file_linux.gif
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

Кстати, я читал, что "-iname" должен найти как прописные, так и строчные файлы, но это тоже не работает:

$find -iname *.gif

./file_linux.gif

(Это также должно найти файл.GIF, верно?).

Ответ 1

find -name *{.GIF,.gif} неверно.

Эта команда сначала exapanded оболочкой, чтобы find -name *.GIF *.gif

Затем дальше

find -name file_BSD.GIF  file_linux.gif 
# as you have only these files in directory

Теперь этот -name file_BSD.GIF file_linux.gif передается для find. И это неправильно, так как нет переключателя типа file_linux.gif который принимается find.

Вам нужна эта команда.

find -name '*.GIF' -or -name '*.gif'

Что такое же, как

find -iname '*.gif'

Обратите внимание на одинарные кавычки (') здесь. Это означает, что *.GIF следует отправлять, чтобы найти, как без расширения оболочки. И поиск будет использовать это как шаблон. Эта одиночная цитата необходима, если вы не избежите метасимволов оболочки. В этом случае команда будет выглядеть так:

find -iname \*.gif

Ответ 2

У вас возникают проблемы с параметром -iname find потому что вы должны указывать шаблоны, которые вы ему даете.

Итак, вы должны сделать:

find -iname '*.gif'

Это указано в руководстве:

"... Обратите внимание, что вы должны процитировать шаблоны, как само собой разумеющееся, иначе оболочка будет расширять любые символы подстановочных знаков в них".

Ответ 3

Вы должны понимать, что (в отличие от Windows) оболочка расширяет *{.GIF,.gif} перед передачей ее программе find.

Вы можете почувствовать, что делает оболочка, заменив программу echo.

Поэтому вы должны указать аргумент программы, например

   echo \-name '*{.GIF,.gif}'

поэтому запустите

   find -name '*.{GIF,gif}'

Может быть, вы хотите

   find -name '*.gif' -o -name '*.GIF'

Пожалуйста, прочитайте Руководство по разработке сценариев Advanced Bash (и, возможно, man-страницу execve (2), чтобы понять, как запускаются программы ядра).