wild cards on find и ls

19

Я пытаюсь найти 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, правильно?).

    
задан Juan Pablo Barrios 16.11.2012 в 21:18
источник
  • Чтобы использовать -iname, как вы хотите, вы должны указать шаблон, который вы ему даете. Я добавил это как ответ. –  Nicolás 16.11.2012 в 21:30
  • В стороне, я думаю, стоит отметить, что фигурные скобки ({}) in -name не распознаются как специальные (см. шаблон-образец в linuxcommand.org/man_pages/find1.html). Например, вы не можете найти jpgs и jpegs следующим образом: find -iname '* .jp {, e} g'. –  luissquall 28.11.2016 в 19:04

3 ответа

32

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 следует отправить, чтобы найти as is без расширения оболочки. И поиск будет использовать это как шаблон. Эта одиночная цитата необходима, если вы не избежите метасимволов оболочки. В этом случае команда будет выглядеть как

find -iname \*.gif
    
ответ дан Shiplu Mokaddim 16.11.2012 в 21:26
  • «То же, что и find -iname '* .gif». Нет. Это с радостью примет файл, заканчивающийся на .giF, который предыдущая команда не принимает. –  cmaster 09.03.2018 в 14:39
7

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

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

find -iname '*.gif'

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

  

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

    
ответ дан Nicolás 16.11.2012 в 21:28
3

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

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

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

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

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

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

Возможно, вы хотите

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

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

    
ответ дан Basile Starynkevitch 16.11.2012 в 21:28