正しい構文は次のとおりです。
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
よりも優先順位が低いため、Chrisの提案に従って名前の部分を括弧に入れます。
最初のバージョンを実行する1つの方法を次に示します。
find -type f -regex ".*/.*\.\(shtml\|css\)"
ファイルのみを含めるには、括弧で囲む必要があります。
find . -type f \( -name "*.shtml" -o -name "*.css" \) -print
ボーナス:これはPOSIX準拠の構文です。
私はしばしば自分自身がegrepまたはより長いパイプ、あるいはさらに複雑なフィルターのためのPerlを使用してしまうことに気づきます。
find . -type f | egrep '\.(shtml|css)$'
find . -type f | Perl -lne '/\.shtml|\.css|page\d+\.html$/ and print'
効率は多少低下するかもしれませんが、それは通常問題ではありません。より複雑なものについては、通常、構築および変更が容易です。
奇妙なファイル名のファイル(たとえば改行を含む)にはこれを使用しないことに関する標準の警告が適用されます。