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