ワイルドカード拡張の補完的な結果を得るには?
roc
名前に含まれるファイルを一覧表示するには、次のコマンドを実行します。
ls *roc*
roc
しかし、その名前のないすべてのファイルが必要な場合はどうすればよいですか?
ls *[!r][!o][!c]*
そしてls *[!roc]*
動作しません。この「反対」拡張を実行する簡単な方法はありますか?
注:私はbash
答え1
bash
シェルは、以下を使用して有効にすると拡張グロービングモードをサポートします。
shopt -s extglob
有効にすると、このパターンは、一致しない隠された名前ではなくすべての名前、つまり文字列を含まないすべての名前!(*roc*)
と一致します。*roc*
roc
bash
マニュアルから:
extglob
組み込みオプションを使用してシェルオプションを有効にすると、複数の拡張パターン一致演算shopt
子が認識されます。次の説明では、aはpattern-list
で区切られた1つ以上のパターンのリストです|
。複合パターンは、次のサブパターンのうちの1つ以上を使用して形成できます。
?(pattern-list)
指定されたパターンがゼロまたは1つ発生するのと一致します。
*(pattern-list)
指定されたパターンのゼロ以上の発生と一致します。
+(pattern-list)
与えられたパターンと1つ以上一致します。
@(pattern-list)
与えられたパターンの1つと一致
!(pattern-list)
与えられたパターンの1つを除くすべての項目と一致
答え2
注:これはあなたが要求したものではなく、要求されたものに対する解決策です。
通常私は問題を考え直し、次のようにします。
ls * | grep -v roc
私は1年に1回使用できる(それを忘れる可能性がある)ものを見つけるよりも一般的なツール(および私が使用する一般的なコマンド)を使用することを好みます。
ワイルドカードを使用すると、非常に複雑になる可能性があります。シェルごとに結果が異なるため、潜在的にスクリプトを移植できなくなります。