Який правильний синтаксис для:
find . -type f -name \*.\(shtml\|css\)
Це працює, але не є елегантним:
find . -type f -name \*.shtml > f.txt && find . -type f -name \*.css >> f.txt
Як зробити те ж саме, але меншою кількістю натискань клавіш?
Який правильний синтаксис для:
find . -type f -name \*.\(shtml\|css\)
Це працює, але не є елегантним:
find . -type f -name \*.shtml > f.txt && find . -type f -name \*.css >> f.txt
Як зробити те ж саме, але меншою кількістю натискань клавіш?
Відповіді:
Ви можете комбінувати різні пошукові вирази з логічними операторами -or
або -and
, так що ваш випадок може бути записаний як
find . -type f \( -name "*.shtml" -or -name "*.css" \)
Це також показує, що вам не потрібно уникати спеціальних символів оболонки під час використання лапок.
Редагувати
Оскільки -or
має нижчий пріоритет, ніж мається на увазі -and
між круглою дужкою -type
та першою -name
введеною назвою частиною в дужках, як запропонував Кріс.
). Second, the parentheses need to go around whole ‘primaries’ (the open parenthesis needs to be before
-name ' , а не між ним та його 'операндом').
Ось один із способів зробити вашу першу версію:
find -type f -regex ".*/.*\.\(shtml\|css\)"
Я часто стикаюся з використанням egrep, або довших труб, або perl для ще складніших фільтрів:
find . -type f | egrep '\.(shtml|css)$'
find . -type f | perl -lne '/\.shtml|\.css|page\d+\.html$/ and print'
Це може бути дещо менш ефективно, але це зазвичай не викликає занепокоєння, а для складніших матеріалів, як правило, простіше побудувати і модифікувати.
Стандартний застереження стосується того, що не використовувати це для файлів із дивними іменами (наприклад, що містять нові рядки).