web-dev-qa-db-ja.com

複数の拡張子でフィルタリングされたファイルを検索する

正しい構文は次のとおりです。

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

これは機能しますが、洗練されていません:

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

同じようにする方法はありますが、より少ないキーストロークで?

53
Dave Jarvis

さまざまな検索式を論理演算子-orまたは-andと組み合わせることができるため、大文字と小文字を次のように書くことができます

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

これは、引用符を使用するときに特別なシェル文字をエスケープする必要がないことも示しています。

編集

-orは、-andと最初の-typeの間の暗黙の-nameよりも優先順位が低いため、Chrisの提案に従って名前の部分を括弧に入れます。

75

最初のバージョンを実行する1つの方法を次に示します。

find -type f -regex ".*/.*\.\(shtml\|css\)"

ファイルのみを含めるには、括弧で囲む必要があります。

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

ボーナス:これはPOSIX準拠の構文です。

13
Teddy

私はしばしば自分自身がegrepまたはより長いパイプ、あるいはさらに複雑なフィルターのためのPerlを使用してしまうことに気づきます。

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

効率は多少低下するかもしれませんが、それは通常問題ではありません。より複雑なものについては、通常、構築および変更が容易です。

奇妙なファイル名のファイル(たとえば改行を含む)にはこれを使用しないことに関する標準の警告が適用されます。

4
reinierpost