7つのファイルセットがあるとしましょう。
item1_data
item2_data_more
item3_data
item4_data
item5_data_more
other6_data
other7_data_more
item
で始まるが終わらない3つを一致させたいと思いますmore
。これが例のシナリオであることを考えると、単に肯定的なitem*data?
一致パターン(または単純な変形)を一致させるだけでは不十分であることを認めるべきです。
私はbash
活性化を使用していますextglob
。簡単な場合は、マニュアルページの説明で十分です("!(pattern‐list)
与えられたパターンの1つを除くすべての項目と一致))しかし、ここではペアマッチングを達成する必要がありますが、否定的なマッチングがitem
必要data
です。
shopt -s extglob # Enable extended globbing
touch {item{1,3,4},other6}_data {item{2,5},other7}_data_more # Example data set
ls !(*more) # Non-"item" files too
item1_data item3_data item4_data other6_data
ls item*!(more) # All "item" files
item1_data item2_data_more item3_data item4_data item5_data_more
ls item!(*more) # Works as required
item1_data item3_data item4_data
なぜ2番目は失敗し、3番目は成功したのですか?私はワイルドカードがどの場所でも動作しなければならないと思いましたが、明らかにそうではありませんでした。誰かが私を実現できますか?
答え1
item*
各ファイルの完全なファイル名が一致し、通常は末尾の空の文字列が一致するため、2番目の式が失敗すると言いたいと思います!(more)
。
答え2
私に必要な答えは、次のいずれかで見つけることができます。その他の回答この問題についてBashで複数の例外を提供しながらワイルドカードrmファイルをターゲットにする方法参考までにコメント私の質問に。
私にぴったりのフレーズはこうだ。
注目すべき重要な点は
!(…)
すでに*
これは、それ自体が内部アイテムの1つではないアイテムと一致するためです。
私はそれが*
私の理解の障壁になるのと同じだとは思わない。