
たとえば、次のようなファイルがあります。
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 するために「除外」コマンド (ある場合) を使いたいと思いますs
。a
_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
PROJECT
varは次のように設定できます。~/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
。