重複したBash中括弧拡張を削除する

重複したBash中括弧拡張を削除する

一致が重複している場合、中かっこ拡張によってファイル名の複数のインスタンスが生成されることがあります。

簡単な例:

mkdir testdir; cd testdir
touch abcd
for f in *{b,c}*; do something_to "$f"; done
# or more simply:
ls -l *{b,c}*

これは説明目的でのみ使用される非常に簡単な例です。この場合、単一のファイルがabcd2回処理(またはリスト)されます。

このリストを重複排除する最良の方法は何ですか?

  • 連想配列を使用できます。
  • 洗練されたglob/brace拡張を使用できますが、これは強力ではありません。

答え1

はい、

for f in *{b,c}*

まず、次に展開してください。

for f in *b* *c*

その後、これら2つのglobの独立した拡張によって繰り返されます。

あなたが望むのは塊です。はい*[bc]*。ただし、より複雑な場合は、bashkshなどの拡張globを有効にする必要があります。 nullglob オプションが必要な場合もあります:

shopt -s nullglob extglob
for f in *@(b|c)*; do...

存在するzsh

for f in *(b|c)*(N); do

(N)各グローブの存在nullglob

存在するksh93

for f in ~(N)*@(b|c)*; do

関連情報