2011-07-19 12 views
13

Linuxでfindコマンドを使用する場合は、一致するemacs regualr式を使用する-regexフラグを追加できます。ファイルタイプを検索から除外する正規表現

.jar個のファイルと.ear個のファイル以外のすべてのファイルを検索したいと考えています。この場合、正規表現はどのようになりますか?

おかげ

答えて

28

ここに正規表現は必要ありません。あなたは-name-notオプションでfindを使用することができます。

find . -not -name "*.jar" -not -name "*.ear" 

上記のより簡潔な(あまり読み)バージョンは次のとおりです。この場合、正規表現を使用して

find . ! \(-name "*.jar" -o -name "*.ear" \) 
+1

+1、それははるかに読みやすいので、これを示唆していました。 – carlpett

+0

私は同意する、正規表現はおそらく過剰です。 –

+0

あなたは正しいですが、私はそれを関数として使用しており、エンドユーザのニーズが何であるかわからないので、できるだけジェネリックにしようとしています – Michael

11

EDIT:新しいアプローチ:

POSIXの正規表現は、前後参照をサポートしていないので、あなたは試合結果を否定する必要があります。

find . -not -regex ".*\.[je]ar" 

以前に掲載の答えは、このように後読みを使用し、ここでは機能しませんが、ここでは完全を期しています:

.*(?<!\.[je]ar)$ 
+0

はコマンドで機能しないようです。私は 'findを使っています。 '-regextypeオプションをオプションでない引数の後ろに指定しました。--regextypeオプションを指定しました。オプションは定位置ではありません(-regextypeは、その前に指定されたテストおよびその後に指定されたテストに影響します)。他の引数の前にオプションを指定してください。 ' – Michael

+0

' regex'オプションの後ろに 'regextype'オプションを置く必要があるように聞こえます。しかし、「posix-extended」は正しいとは言えません。 POSIXにはAFAIKがありません。 –

+0

'find'はPOSIX BRE/EREエンジンのみをサポートしているようです。その場合、このソリューションはまったく機能しません。それは申し訳ありません(誰がこれをアップウィートしましたか?)... –

0

はやり過ぎのように聞こえます(名前が何かで終わっているかどうかだけ調べることができます)。私はEmacsの構文についてはよく分からないが、このような何かが動作するのに十分な汎用的でなければなりません:

\.(?!((jar$)|(ear$))) 

すなわちドットを見つける($)「瓶」やエンディングが続いていない(|)「耳を(。) "

+0

ファイル名にドットが含まれていない場合はどうなりますか?または1つ以上のドット? ( '-regex'オプションはファイル名の一部ではなくファイル名全体と一致します) –

4
find . -regextype posix-extended -not -regex ".*\\.(jar|ear)" 

これは、仕事をするだろう、と私は個人的に他のソリューションのいくつかよりも、それは少し明確に見つけます。残念ながら、キャプチャグループを動作させるには-regextypeが必要です(そうでなければ単純なコマンドを混乱させる)。

関連する問題