шаблон` find-name', который соответствует нескольким шаблонам



Я пытался получить список всех файлов python и html в каталоге с помощью команды find Documents -name "*.{py,html}".



затем появилась страница man:




фигурные скобки в шаблоне ('{}') не считаются особыми (то есть найти . - имя 'foo{1,2}' соответствует файлу с именем foo{1,2}, а не файлам foo1 и foo2.




поскольку это часть цепочки каналов, я хотел бы иметь возможность указать, какие расширения он соответствует во время выполнения (без жесткого кодирования). Если найти просто не может этого сделать, perl one-liner (или аналогичный) будет в порядке.



Edit: ответ, который я в конечном итоге придумал, включает в себя все виды дерьма и немного длинен, поэтому я опубликовал его как ответ на оригинальный зуд, который я пытался поцарапать. Не стесняйтесь взломать это, если у вас есть лучшие решения.

457   10  

10 ответов:

использовать -o, что означает "или":

find Documents \( -name "*.py" -o -name "*.html" \)

Edit: извините, просто перечитайте вопрос... вам нужно будет построить эту командную строку программно, что не так просто.

вы используете bash (или Cygwin на Windows)? Если да, то вы должны быть в состоянии сделать это:

ls **/*.py **/*.html

что может быть проще программно.

Edit: Applied @artbristol комментарий к ответу.

некоторые выпуски find, в основном в системах linux, возможно, на других, а также поддерживают параметры-regex и-regextype, которые находят файлы с именами, соответствующими регулярному выражению.

find . -regextype posix-egrep -regex ".*\.(py|html)$" 

должны сделать трюк в приведенном выше примере. Однако это не стандартная функция POSIX find и зависит от реализации.

вы можете программно добавить больше -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"

как меньше процесс intencive find исполнение Брендана Лонга и Стефана 202 и др.:

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 день, только в текущем каталоге, пропуская подкаталоги.

Comments

    Ничего не найдено.