2011-12-15 9 views
46

は、ここに1つは、bashで、パターンに一致するすべてのファイルを一覧表示するかもしれない方法は次のとおりです。パターンに一致しないファイルを一覧表示しますか?

ls *.jar 

パターンの補数を一覧表示する方法は?つまり、* .jarと一致しないすべてのファイル?

+0

これはおそらくregexとラベル付けされるべきではなく、*はシェルグロブワイルドカードであり、正規表現*ではありません。これは「0以上の量子」です。 – sweaver2112

+0

良い点ですが、私はregexの使用がおそらくあなたが期待するマッチを得るためのより良い習慣であることを学んでいます。 – paislee

答えて

38
ls | grep -v '\.jar$' 

などです。

+2

grepの-vフラグとは何ですか? – paislee

+12

反転一致。 'man grep 'もあります。 –

+0

どのように2つのファイルタイプを行うことができますか? – Dan

2

一つの解決策はfindの適切なバージョンでls -1|grep -v '\.jar$'

+0

[ls'の出力を解析しない](http://mywiki.wooledge.org/ParsingLs)、ありがとう。 –

+6

@gniourf_gniourfは、 'ls'の解析や' goto'の使用などのルールについては宗教的ではありません。場合によっては、これらのソリューションが最適な場合もあります。 –

+1

これはそのようなケースの1つではありません。 'find。 -print0 | grep -z '\ .jar $' 'は、あなたが' --ignore'やBashの拡張グロブリングを使いたくない場合でもうまく動作します。つまり、ほとんどの人はルールやそれを理解するために記事全文を読んでほしくないと言っています。コメントの代わりに 'find -print0'と' grep -z'を代わりに使用してください。 –

13

になり、あなたはこのような何かを行うことができますが、それは少しやり過ぎだ:

find . -maxdepth 1 ! -name '*.jar' 

findファイルを検索します。 .引数は、現在のディレクトリである.から検索を開始することを指定します。 -maxdepth 1は、あるレベルの深い、つまり現在のディレクトリだけを検索したいと伝えます。 ! -name '*.jar'と一致しないすべてのファイルを正規表現*.jarと照合します。

私が言ったように、このアプリケーションではちょっと残念ですが、-maxdepth 1を削除すると、再帰的にすべての非jarファイルや簡単に検索できます。

27

リトル知られているbashの拡張ルール:

ls !(*.jar) 
+2

bash:!:イベントが見つかりません。私が必要なものは何? – paislee

+6

コマンドラインで 'shopt -s extglob'を実行してから、コマンドを入力してみてください。 –

58

利用のegrepスタイルの拡張パターンマッチング。

ls !(*.jar) 

これはbash-2.02-alpha1から利用可能です。 は、最初にデフォルトでこれを有効にする設定オプションがあるのbash-4.1-αのとおり

shopt -s extglob 

を有効にする必要があります。

+1

shopt -s extglobに言及してくれました! –

+2

これは正解です。正しいとマークされた答えはシェルを直接使用せず、補助コマンドを使用します。 – dbn

+0

@dbw - 私はこの答えがもっと好きでも、受け入れられた答えは質問のために大丈夫です。 OPは、「シェルを直接使用する」ことを特に要求していません。 –

14

POSIXは、一致しないブラケット式を定義しているので、シェルがファイル名を展開できるようにすることができます。

ls *[!j][!a][!r] 

これにはいくつかの癖がありますが、少なくともそれはすべてのUNIXシェルと互換性があります。

+0

POSIX準拠の場合+1。エイリアスと組み合わされた小さなbash/python/ruby​​関数。 "lsnot"は簡単に実行可能にすることができます。 – Nikkolasg

+0

これは3文字より短いものと一致しません。 –

1

複数のファイル拡張子を除外する場合は、ls test/!(*.jar|*.bar)のようにパイプ|で区切ります。のは、それを試してみましょう:

$ mkdir test 
$ touch test/1.jar test/1.bar test/1.foo 
$ ls test/!(*.jar|*.bar) 
test/1.foo 

他の回答を見ると、あなたが最初shopt -s extglobする必要があるかもしれません。

+1

これを '!(*。[bj] ar)'に短縮することができます。 –

関連する問題