шаблон ' find-name`, который соответствует нескольким шаблонам
Я пытался получить список всех файлов python и html в каталоге с помощью команды find Documents -name "*.{py,html}"
.
затем появилась мужская страница:
фигурные скобки в шаблоне ('{}') не считаются специальными (то есть find . - имя "foo{1,2}" соответствует файлу с именем foo{1,2}, а не файлам foo1 и foo2.
поскольку это часть цепочки каналов, я хотел бы указать, какие расширения он соответствует во время выполнения (без жесткого кодирования). Если найти просто не могу, perl one-liner (или аналогичный) был бы в порядке.
Edit: ответ, который я в конце концов придумал, включает в себя все виды дерьма и немного длинный, поэтому я опубликовал его как ответ к первоначальному зуду, который я пытался почесать. Не стесняйтесь взломать это, если у вас есть лучшие решения.
10 ответов
использовать -o
, что означает "или":
find Documents \( -name "*.py" -o -name "*.html" \)
редактировать: извините, просто перечитайте вопрос... вам нужно будет создать эту командную строку программно, что не так просто.
вы используете bash (или Cygwin в Windows)? Если вы, вы должны быть в состоянии сделать это:
ls **/*.py **/*.html
что может быть проще программно.
редактировать: приложенный комментарий @ artbristol к ответу.
некоторые выпуски find, в основном в системах linux, возможно, и в других вариантах поддержки-regex и-regextype, которые находят файлы с именами, соответствующими регулярному выражению.
find . -regextype posix-egrep -regex ".*\.(py|html)$"
должны сделать трюк в приведенном выше примере. Однако это не стандартная функция поиска POSIX и зависит от реализации.
вы можете программно добавить больше -name
пунктах, разделенных -or
:
find Documents \( -name "*.py" -or -name "*.html" \)
или вместо этого перейдите к простому циклу:
for F in Documents/*.{py,html}; do ...something with each '$F'... ; done
У меня была подобная необходимость. Это сработало для меня:
find ../../ \( -iname 'tmp' -o -iname 'vendor' \) -prune -o \( -iname '*.*rb' -o -iname '*.rjs' \) -print
это найдет все .C или .cpp файлы на linux
$ find . -name "*.c" -o -name "*.cpp"
вам не нужна экранированная скобка, если вы не делаете некоторые дополнительные моды. Вот с man-страницы они говорят, что если шаблон соответствует, распечатайте его. Возможно, они пытаются контролировать печать. В этом случае-print действует как условное и становится условным "AND'D". Это предотвратит любой .c файлы от печати.
$ find . -name "*.c" -o -name "*.cpp" -print
но если вам нравится оригинальный ответ, вы можете контролировать печать. Это найдет все .с файлов, а также.
$ find . \( -name "*.c" -o -name "*.cpp" \) -print
мое значение по умолчанию:
find -type f | egrep -i "*.java|*.css|*.cs|*.sql"
как менее интенсивный процесс find
выполнение длинными Брендан и Stephan202 и соавт.:
find Documents \( -name "*.py" -or -name "*.html" \)
#! /bin/bash
filetypes="*.py *.xml"
for type in $filetypes
do
find Documents -name "$type"
done
простой, но работает :)
Мне нужно было удалить все файлы в дочерних dirs, за исключением некоторых файлов. Для меня сработало следующее (указаны три шаблона):
find . -depth -type f -not -name *.itp -and -not -name *ane.gro -and -not -name *.top -exec rm '{}' +
find MyDir -iname "*.[j][p][g]"
+
find MyDir -iname "*.[b][m][p]"
=
find MyDir -iname "*.[jb][pm][gp]"
это работает на оболочке AIX korn.
find *.cbl *.dms -prune -type f -mtime -1
этого ищем *.cbl
или *.dms
которым 1 день, только в текущем каталоге, пропуская подкаталоги.