「*」を使用してすべての例外をキャッチする方法

「*」を使用してすべての例外をキャッチする方法

たとえば、次のようなファイルがあります。

A_1.txt A_t_1.txt A_ts_1.txt A_tsa_1.txt

ディレクトリに~/admin/packages/

A_1.txtにワイルドカードを渡すためにforループを作成しています。

for f in ~/admin/packages/*_1.txt

明らかに、これはこれらのファイルの1つにワイルドカードとして使用できます。

t具体的に、先に、 がないかぎりすべてのファイルを glob するために「除外」コマンド (ある場合) を使いたいと思いますsa_1.txt

編集:パスを変数として保存することを忘れました。

PROJECT="~/admin/packages/*_1.txt"

for f in ${PROJECT}...

答え1

extglobこれを行うには、次のパターンを使用できますbash

!(*t|*s|*a)_1.txt

extglobまず有効にします(まだ有効になっていない場合)。

shopt -s extglob

これにより、次のことができます。

for f in ~/admin/packages/!(*t|*s|*a)_1.txt; do ##Something; done

例:

$ echo *_1.txt
A_1.txt Ab_1.txt A_t_1.txt A_ts_1.txt A_tsa_1.txt

$ shopt -s extglob

$ echo !(*t|*s|*a)_1.txt
A_1.txt Ab_1.txt

短くしてください(ありがとうございます錯乱):

!(*[tsa])_1.txt

答え2

PROJECTvarは次のように設定できます。~/admin/packages/*[^tsa]_1.txt

PROJECT="~/admin/packages/*[^tsa]_1.txt"

場合は修正が可能です。

答え3

case次のようにステートメントを使用して例外をクリアします。

for f in ${PROJECT}; do
    case "$f" in *[tsa]_1*) continue;; esac

    # ... actual work here ...
done

答え4

あなたの要求に対する正確な答えは、次のものを使用することですGLOBIGNORE

このコマンドを実行すると:

LESS=+/'^ *GLOBIGNORE' man bash

読む:

GLOBIGNORE
パス名拡張時に無視されるファイル名のセットを定義するコロンで区切られたパターンのリスト。パス名拡張パターンに一致するファイル名が GLOBIGNORE のパターンの 1 つとも一致する場合は、一致リストから削除されます。

したがって、GLOBIGNORE次のように設定するだけです。

$  ls *
A_1.txt  A_t_1.txt  A_ts_1.txt  A_tsa_1.txt
$ GLOBIGNORE=*t_1.txt:*s_1.txt:*a_1.txt
$ ls *
A_1.txt

GLOBIGNOREその後、復元を使用して空にすることができますunset GLOBIGNORE

関連情報