дикие карты на находке и 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), чтобы понять, как запускаются программы ядра).