шаблон `find -name`, который соответствует нескольким шаблонам - PullRequest
283 голосов
/ 16 июля 2009

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

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

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

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

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

Ответы [ 11 ]

424 голосов
/ 16 июля 2009

Используйте -o, что означает «или»:

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

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

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

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

, который может быть проще построить программно.

Редактировать : Добавлен комментарий @artbristol к ответу.

49 голосов
/ 23 января 2012

В некоторых выпусках find, в основном в системах Linux, возможно, в других также поддерживаются опции -regex и -regextype, которые находят файлы с именами, соответствующими регулярному выражению.* следует сделать трюк в приведенном выше примере.Однако это не стандартная функция поиска POSIX и зависит от реализации.

28 голосов
/ 16 июля 2009

Вы можете программно добавить больше -name предложений, разделенных -or:

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

Или вместо этого перейдите к простому циклу:

for F in Documents/*.{py,html}; do ...something with each '$F'... ; done
11 голосов
/ 27 января 2010

У меня была похожая потребность. Это сработало для меня:

find ../../ \( -iname 'tmp' -o -iname 'vendor' \) -prune -o \( -iname '*.*rb' -o -iname '*.rjs' \) -print
9 голосов
/ 23 ноября 2016

Это найдет все .c или .cpp файлы в linux

$ find . -name "*.c" -o -name "*.cpp"

Вам не нужны экранированные скобки, если вы не используете дополнительные моды. Здесь со страницы руководства они говорят, что если шаблон соответствует, распечатайте его. Возможно, они пытаются контролировать печать. В этом случае -print действует как условный и становится условным оператором AND. Это предотвратит печать всех файлов .c.

$ find .  -name "*.c" -o -name "*.cpp"  -print

Но если вам нравится оригинальный ответ, вы можете контролировать печать. Также будут найдены все файлы .c.

$ find . \( -name "*.c" -o -name "*.cpp" \) -print
4 голосов
/ 14 января 2016

Мои значения по умолчанию:

find -type f | egrep -i "*.java|*.css|*.cs|*.sql"

Как менее интенсивное выполнение find Бренданом Лонгом и Stephan202 и др.

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

2 голосов
/ 23 июля 2013
#! /bin/bash
filetypes="*.py *.xml"
for type in $filetypes
do
find Documents -name "$type"
done

просто, но работает:)

1 голос
/ 08 февраля 2017
find MyDir -iname "*.[j][p][g]"
+
find MyDir -iname "*.[b][m][p]"
=
find MyDir -iname "*.[jb][pm][gp]"
1 голос
/ 13 января 2012

Мне нужно было удалить все файлы в дочерних каталогах, кроме некоторых файлов. У меня сработало следующее (указаны три модели):

find . -depth -type f -not -name *.itp -and -not -name *ane.gro -and -not -name *.top -exec rm '{}' +
0 голосов
/ 25 ноября 2018

А как же

ls {*.py,*.html}

В нем перечислены все файлы, оканчивающиеся на .py или .html в их именах

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...