Я пытался получить список всех файлов Python и HTML в каталоге с помощью команды find Documents -name "*.{py,html}"
.
Затем появилась справочная страница:
Скобки в шаблоне ('{}') не считаются специальными (то есть find. -Name 'foo {1,2}' соответствует файлу с именем foo {1,2}, а не файлам foo1 и foo2.
Поскольку это часть конвейерной цепочки, я хотел бы иметь возможность указать, каким расширениям он соответствует во время выполнения (без жесткого кодирования). Если find просто не может этого сделать, однострочный perl (или аналогичный) будет в порядке.
Редактировать: ответ, который я в конечном итоге придумал, включает в себя все виды дерьма, и он тоже немного длинный, поэтому я разместил его как ответ на первоначальный зуд, который я пытался поцарапать. Не стесняйтесь взломать это, если у вас есть лучшие решения.
locate
, хотя и с оговоркой, что внутренняя обновленная версия b может быть неактуальной. Но это быстро.Ответы:
Используйте
-o
, что означает «или»:Вам нужно построить эту командную строку программно, а это не так просто.
Вы используете bash (или Cygwin в Windows)? Если вы, вы должны быть в состоянии сделать это:
который может быть проще построить программно.
источник
**
рекурсивный поиск; Bash поддерживает его только в версиях 4.0 и выше и только сshopt -s globstar
.-name
скобки, если вы используете-exec
. Напримерfind Documents \( -name "*.py" -o -name "*.html" \) -exec file {} \;
-print0
для обработки имен файлов с пробелами.Некоторые выпуски find, в основном в системах Linux, возможно, в других также поддерживают опции -regex и -regextype, которые находят файлы с именами, соответствующими регулярному выражению.
например
следует сделать трюк в приведенном выше примере. Однако это не стандартная функция поиска POSIX и зависит от реализации.
источник
find . -regex ".*\.\(py\|html\)$"
это работает, потому что по умолчанию находят регулярные выражения в стиле Emacs, которые немного отличаются, поэтому вам не нужно указывать тип регулярного выражения.-regextype posix-egrep
это удобно (в противном случае вам нужно избегать большого количества символов). Это команда find, которую я использовал для dist-hook при создании zip-дистрибутива Windows (находит изменяемые файлы, а в файле изменяет их на dos-eol):find -regextype posix-egrep -regex ".*(\.([chyl]|def|cpy|cob|conf|cfg)|(README|ChangeLog|AUTHORS|ABOUT-NLS|NEWS|THANKS|TODO|COPYING.*))$" -exec sed -i -e 's/\r*$/\r/' {} \;
Вы можете программно добавить больше
-name
предложений, разделенных-or
:Или вместо этого перейдите к простому циклу:
источник
*.py
файлов, либо у вас странная версияfind
. Команда, перечисленная выше, работает просто отлично.-iname
. Он возвращает*.py
файлы, только если записывает его в последней позиции (iname *.html
как и первое выражение) . Я использую команду на Debian.Это найдет все .c или .cpp файлы в Linux
Вам не нужны экранированные скобки, если вы не используете дополнительные моды. Здесь со страницы руководства они говорят, что если шаблон соответствует, распечатайте его. Возможно, они пытаются контролировать печать. В этом случае -print действует как условный и становится условным «И». Это предотвратит печать любых файлов .c.
Но если вам нравится оригинальный ответ, вы можете контролировать печать. Это также найдет все .c файлы.
Последний пример для всех исходных файлов c / c ++
источник
У меня была похожая потребность. Это сработало для меня:
источник
()
find -name "*.cpp" -o -name "*.c" -o -name "*.cc" -print0
мне пришлось использовать пару символов, чтобы группа вторая или оператор.find -name "*.cpp" -o \( -name "*.c" -o -name "*.cc" \) -print0
Может быть так, что -print0, который всегда "true", повлиял на логику.Мой по умолчанию был:
find -type f | egrep -i "*.java|*.css|*.cs|*.sql"
Как и менее интенсивные процессы
find
исполнения Бренданом Лонгом и Стефаном202 и др .:источник
egrep
регулярных выражений, скорее, у вас есть оболочка, где следует использовать регулярное выражение. (Кроме того, типичноеfind
использование:,find {directory} [options...] [action]
где, в зависимости от impl,directory
может по умолчанию.
и поaction
умолчанию-print
, но я буду в явном виде.) Вместо этого, используйте что-то вроде:find . -type f -print | egrep -i '\.java$|\.css$|\.cs$|\.sql$'
Но также, как очень быстрая альтернативаfind
, можно также попробуйтеlocate
аналогичным образом (хотя и не обязательно в актуальном состоянии, так как он запрашивает внутреннюю базу данных для списка файлов)просто но работает :)
источник
Мне нужно было удалить все файлы в дочерних каталогах, за исключением некоторых файлов. У меня сработало следующее (указаны три модели):
источник
Брекеты в шаблоне
\(\)
требуются для шаблона имени сor
Пока для шаблона имени с
and
оператором это не требуетсяисточник
Это работает на AIX Korn Shell.
Это ищет
*.cbl
или*.dms
которые 1 день, только в текущем каталоге, пропуская подкаталоги.источник
источник
Что о
В нем перечислены все файлы, заканчивающиеся на .py или .html в их именах файлов.
источник