web-dev-qa-db-ja.com

パターンに一致しないファイルをリストしますか?

Bashのパターンに一致するすべてのファイルをリストする方法は次のとおりです。

ls *.jar

パターンの補完をリストする方法は?つまり、*。jarに一致しないすべてのファイルですか?

54
paislee
ls | grep -v '\.jar$'

例えば。

Egrepスタイルの拡張パターンマッチングを使用します。

ls !(*.jar)

これは、bash-2.02-alpha1以降で利用可能です。最初に有効にする必要があります

shopt -s extglob

Bash-4.1-alphaの時点で、デフォルトでこれを有効にする設定オプションがあります。

70
Christian

あまり知られていないbash拡張ルール:

ls !(*.jar)
33
ccarton

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

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

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

18
stefanct

findの適切なバージョンを使用すると、次のようなことができますが、少しやり過ぎです。

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

findはファイルを検索します。 .引数は、.、つまり現在のディレクトリから検索を開始することを指定します。 -maxdepth 1は、1レベル、つまり現在のディレクトリのみを検索するように指示します。 ! -name '*.jar'は、正規表現*.jarと一致するdo n'tのすべてのファイルを検索します。

先ほど言ったように、このアプリケーションでは少しやり過ぎですが、-maxdepth 1を削除すると、すべての非jarファイルまたは簡単にできるものを再帰的に検索できます。

15
Dan Fego

また、複数のファイル拡張子を除外する場合は、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する必要があるかもしれません。

2
James Brown

1つの解決策はls -1|grep -v '\.jar$'

2
fge

lsがサポートしている場合(man ls) 使用 --hide=<PATTERN>オプション。あなたの場合:

$> ls --hide=*.jar

lsの出力を解析する必要はありません(非常に悪いため)。複数の種類のファイルを表示しないように拡張されます。ある時点で、(ソース)、非オブジェクト、非libtoolで生成されたファイルが(混乱した)ディレクトリにあるかどうかを確認する必要がありました。

$> ls src --hide=*.{lo,c,h,o}

魅力のように働いた。

2
haavee

別のアプローチとして、ls -Iフラグ(パターンを無視)。

ls -I '*.jar'