Bashのパターンに一致するすべてのファイルをリストする方法は次のとおりです。
ls *.jar
パターンの補完をリストする方法は?つまり、*。jarに一致しないすべてのファイルですか?
ls | grep -v '\.jar$'
例えば。
Egrepスタイルの拡張パターンマッチングを使用します。
ls !(*.jar)
これは、bash-2.02-alpha1以降で利用可能です。最初に有効にする必要があります
shopt -s extglob
Bash-4.1-alphaの時点で、デフォルトでこれを有効にする設定オプションがあります。
あまり知られていないbash拡張ルール:
ls !(*.jar)
POSIXは、一致しないブラケット式を定義するため、シェルにファイル名を展開させることができます。
ls *[!j][!a][!r]
ただし、これにはいくつかの癖がありますが、少なくともすべてのUNIXシェルと互換性があります。
find
の適切なバージョンを使用すると、次のようなことができますが、少しやり過ぎです。
find . -maxdepth 1 ! -name '*.jar'
find
はファイルを検索します。 .
引数は、.
、つまり現在のディレクトリから検索を開始することを指定します。 -maxdepth 1
は、1レベル、つまり現在のディレクトリのみを検索するように指示します。 ! -name '*.jar'
は、正規表現*.jar
と一致するdo n'tのすべてのファイルを検索します。
先ほど言ったように、このアプリケーションでは少しやり過ぎですが、-maxdepth 1
を削除すると、すべての非jarファイルまたは簡単にできるものを再帰的に検索できます。
また、複数のファイル拡張子を除外する場合は、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つの解決策はls -1|grep -v '\.jar$'
ls
がサポートしている場合(man ls
) 使用 --hide=<PATTERN>
オプション。あなたの場合:
$> ls --hide=*.jar
ls
の出力を解析する必要はありません(非常に悪いため)。複数の種類のファイルを表示しないように拡張されます。ある時点で、(ソース)、非オブジェクト、非libtoolで生成されたファイルが(混乱した)ディレクトリにあるかどうかを確認する必要がありました。
$> ls src --hide=*.{lo,c,h,o}
魅力のように働いた。
別のアプローチとして、ls -I
フラグ(パターンを無視)。
ls -I '*.jar'