複数の拡張子でフィルタリングされたファイルを見つける


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は、Chrisが示唆するように、暗黙の-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'

それはやや効率が悪いかもしれませんが、それは通常懸念ではなく、より複雑なものについては通常、構築と変更が簡単です。

奇妙なファイル名のファイル(改行を含むなど)にこれを使用しないことについては、標準的な警告が適用されます。


クリーンでモジュール式のソリューションの場合、検索結果から得られるファイルの処理中にパフォーマンスのボトルネックが通常発生します。
クリスティック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.