Знайдіть файли, відфільтровані за допомогою декількох розширень


52

Який правильний синтаксис для:

find . -type f -name \*.\(shtml\|css\)

Це працює, але не є елегантним:

find . -type f -name \*.shtml > f.txt && find . -type f -name \*.css >> f.txt

Як зробити те ж саме, але меншою кількістю натискань клавіш?

Відповіді:


75

Ви можете комбінувати різні пошукові вирази з логічними операторами -orабо -and, так що ваш випадок може бути записаний як

find . -type f \( -name "*.shtml" -or -name "*.css" \)

Це також показує, що вам не потрібно уникати спеціальних символів оболонки під час використання лапок.

Редагувати

Оскільки -orмає нижчий пріоритет, ніж мається на увазі -andміж круглою дужкою -typeта першою -nameвведеною назвою частиною в дужках, як запропонував Кріс.


Це також буде друкувати каталоги з назвою "* .css".
Тедді

Гм, дужки у вашій оновленій версії дещо недоречні. Окремі дужки повинні знаходитись як окремі параметри, щоб знайти , тому їм потрібні пробіли навколо них (" .css") `, що призводить до єдиного значення рядка; це те саме, що (наприклад) `` .css) ' ). Second, the parentheses need to go around whole ‘primaries’ (the open parenthesis needs to be before -name ' , а не між ним та його 'операндом').
Кріс Джонсен


12

Вам потрібно скористатися дужкою, щоб включати лише файли:

find . -type f \( -name "*.shtml" -o -name "*.css" \) -print

Бонус : це синтаксис, сумісний з POSIX.


4

Я часто стикаюся з використанням egrep, або довших труб, або perl для ще складніших фільтрів:

find . -type f | egrep '\.(shtml|css)$'
find . -type f | perl -lne '/\.shtml|\.css|page\d+\.html$/ and print'

Це може бути дещо менш ефективно, але це зазвичай не викликає занепокоєння, а для складніших матеріалів, як правило, простіше побудувати і модифікувати.

Стандартний застереження стосується того, що не використовувати це для файлів із дивними іменами (наприклад, що містять нові рядки).


+1 для чистого та модульного рішення, вузькі місця продуктивності зазвичай виникають під час обробки файлів, отриманих в результаті пошуку.
Крістік
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.