5

bashでワイルドカードを試し、「xyz」で始まり「.TXT」で終わらないすべてのファイルを一覧表示しようとしましたが、誤った結果が得られました。

これが私が試したコマンドです:

$ ls -l xyz*[!\.TXT]

ディレクトリにある「xyz」および「xyzTXT」という名前のファイルは一覧表示されません。ただし、「xyz1」、「xyz123」が表示されます。

「xyz*」の後に追加すると[!\.TXT]、シェルは「xyz」で始まり、その後に少なくとも1つの文字があるものを検索するようになります。

なぜそれが起こっているのか、そしてこのコマンドを修正する方法について何か考えはありますか?他のコマンドを使用して実行できることはわかっていますが、失敗する理由と、ワイルドカードを使用するだけで実行できるかどうかを知ることに特に関心があります。

4

2 に答える 2

7

これらのコマンドはあなたが望むことをします

shopt -s extglob
ls -l xyz!(*.TXT)
shopt -u extglob

コマンドが機能しない理由は、xyz * [!\。TXT]がxyz * [!\。TX]と同等であるためです。これは、xyzの後に任意の文字シーケンス(*)が続き、最後にセット{! 、\、。、T、X}なので、「xyzwhateveryouwant!」と一致します。'xyzwhateveryouwant\''xyzwhateveryouwant。' 'xyzwhateveryouwantT''xyzwhateveryouwantX'

編集:あなたが望むものは何でも!\。TXのどれも含まないところ

于 2012-07-11T16:27:40.437 に答える
4

これはワイルドカードだけでは実行できないと思います。

次の意味で、コマンドが機能していません。

必要なものが後に続くすべてのものと一致し、xyz後続の文字で終わることはできません:\、、、および。2つ目は、内部にあるものが文字列としてではなく、文字列として読み取られる限り、カウントされません。.TXT[]

.ワイルドカード内で特別な意味がない限り、「エスケープ」する必要はありません。

少なくとも、これはワイルドカードに関する私の知識です。

于 2012-07-11T16:55:01.610 に答える