web-dev-qa-db-ja.com

bashワイルドカードで負の一致を指定できますか?

bashで、ワイルドカードを使用して「[特定の(ワイルドカード)パターンに一致するファイル]を除く現在のディレクトリ内のすべてのファイル」を指定することはできますか?例:「一致しないすべてのファイル*〜」

または、より一般的には、ワイルドカードファイル仕様を2番目のフィルタリングまたは否定仕様で修飾することは可能ですか?

3
RashaMatt

もちろん。すべてのファイルの名前に文字列「foo」が含まれているが、「bar」も含まれているファイルはないとします。あなたが望んでいるのは

foo1
foo2

しかし、あなたはしたくない

 foobar1

単純なグロブを使用して、次のようにすることができます。

for f in foo!(bar)*; echo $f; done

とか、ぐらい

ls foo[^bar]*

詳細については、こちらを参照してください: http://www.tldp.org/LDP/abs/html/globbingref.html 注意してください。どちらの方法にも落とし穴があります。おそらくfindを使用したほうがよいでしょう。

2
bjanssen

この種のグロブを可能にするbashのextglob shoptを指摘してくれたbjanssenに感謝します。

bashのマンページから:

If the extglob Shell option is enabled using the shopt builtin, several
extended pattern matching operators are recognized. In the following 
description, a pattern-list is a list of one or more patterns separated 
by a |.  Composite patterns may be formed using one or more of the following
sub-patterns:

          ?(pattern-list)
                 Matches zero or one occurrence of the given patterns
          *(pattern-list)
                 Matches zero or more occurrences of the given patterns
          +(pattern-list)
                 Matches one or more occurrences of the given patterns
          @(pattern-list)
                 Matches one of the given patterns
          !(pattern-list)
                 Matches anything except one of the given patterns

だから、私の質問に答えるために「どのように指定するか一致しないすべてのファイル*〜 ":

!(*~)

または、extglobを必要とせずに:

*[^~]

そして、より一般的には、私の質問の最後の部分に答えます:

The GLOBIGNORE Shell variable may be used to restrict the set of file names
matching a pattern. If GLOBIGNORE is set, each matching file name that also
matches one of the (colon-separated) patterns in GLOBIGNORE is removed from
the list of matches.
0
RashaMatt