複数のファイル拡張子に `find`を使用する


16

次のコマンドを使用して、JAVAファイルのテキスト行をカウントしています。

find . -name '*.java' | xargs wc -l

find複数のファイル拡張子に一致するようにコマンドパラメーターを変更するにはどうすればよいですか?たとえば、CPP、C、およびHファイルに対して上記の操作を使用したいと思います。


この質問は実際にはfindコマンドに関するものです。一致するファイルを検索する場所だからです。
iglvzx

1
また、find -print0 | xargs -0コンストラクトを使用するか、より優れたシンプルなものを使用しますfind . -name '*.cpp' -o -name '*.c' -o -name '*.h' -exec wc -l {} +。これにより、ファイル名の問題(空白スペース、改行など)が回避され、(非常に)適切なカスタムになります。
ダニエルアンダーソン

回答:


16

-oOR のオプションを使用します。たとえば、これは.cpp.cおよび.hファイルをリストします。

find . -name \*.cpp -o -name \*.c -o -name \*.h

あ。*もはやコードとしてフォーマットされている場合にエスケープする必要はありません。完全に見落としていました。:)
iglvzx

はい、2人で3回編集しましたが、手に入れました。
JOTN

2
これはOSXでは機能しませんでした(最後の-name * .extにのみ一致しました)。以下の@smokingunsで提案されているように、括弧を使用する必要がありました。
ギレアデ

2

-oオプションを使用する必要があります。たとえば、次のステートメントは、フォルダー内のすべてのpng、jpg、gifファイルを検索します。

find . \( -iname \*.png -o -iname \*.jpg -o -iname \*.gif \)

-inameオプションを使用して、大文字と小文字を区別しないようにします。


1
inameは、findのすべてのバージョンで使用できるわけではありません。
JOTN


1

すべての答えは多かれ少なかれ同じですが、複数の名前とブール演算子を中間に置いて読みやすいとは思いません。

私はこれがよりエレガントなソリューションかもしれないと思う:

$ find . -type f | grep -E "\.java$|\.cpp$|\.c$"

これを壊しましょう

  • find . 現在のパスですべてのファイルを再帰的に検索します(必要に応じて他のパスに変更します)
  • -type f検索をファイルのみに絞り込みます(速度はあまり向上しませんが、それでも...)
  • | grep -E私が取得するためにこれを使用するのgrepが認識または|FreeBSDの使用のMac OS Xでの)オペレータのgrepを、GNUのgrepのは(自分の中で確認することを必要としないmanファイル)。
  • "\.java$|\.cpp$|\.c$"ファイルが含まれた正規表現の名前終わる.java.cpp、および.c(必要なものを追加します)

その後、結果リストをパイプして、さらに処理することができます。例えば

$ find . -type f | grep -E "\.java$|\.cpp$|\.c$" | xargs sed -i '' $'/s/\r$//'

この例ではCRLF、OS X / LinuxのDOS / Windowsの行末を削除しますLF(これはOS Xのsed構文でもあります。バージョンの詳細を確認してください)。


25種類の拡張子一致パラメーターを使用して、すべての種類のビデオファイルを検索したかった。これが私にとって有効な唯一のアプローチでした。(Ubuntu 14.04 LTS)
オタク長老
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.