各ファイルセットがグローバルパターンと一致する複数のファイルセットのそれぞれに対して、同じ集計操作を実行したいと思います。私が望んでいないのは、各ファイル名を個別に集計関数にパイプすることです。
最初の試みは失敗しました。外部ループでは、ファイル名がワイルドカードとして指定され、コレクション全体を別々のバッチとして処理するのではなく、単純なリストにマージしたためです。
for fileglob in /path/to/bunch*1 /path/to/bunch*2 ... ; do
stat "$fileglob" | awk [aggregation]
done
したがって、*
ループをエスケープして非表示にし、関数をエスケープ解除します。
for fileglob in /path/to/bunch*1 /path/to/bunch*2 ... ; do
realglob=`echo "$fileglob" | sed 's/\\//g'`
stat "$realglob" | awk [aggregation]
done
より良い方法が必要です。それは何ですか?
GNUバッシュ、バージョン3.2.51
答え1
これを行うには、引用符を慎重に使用する必要があります。
for fileglob in '/path/to/bunch*1' '/path/to/bunch*2' ... ; do
stat $fileglob | awk [aggregation]
done
ただし、スペース(または改行)を含むファイル名は失敗する可能性があります。これを使用する方が良いです。
fileglobs=("/path/to/bunch*1" "/path/to/bunch*2")
for aglob in "${fileglobs[@]}" ; do
set -- $aglob
stat "$@" | awk [aggregation]
done
globが正しく拡張され、位置引数に配置されました。
set -- $aglob
その後、各パラメータは次の場所にパラメータとして配置されますstat
。
stat "$@"
そして出力はstat
(出力として)awk
。
答え2
外部ループでグローバルパターンを解釈したくない場合は、一重引用符でグローバルパターンを囲みます。
for fileglob in '/path/to/bunch*1' '/path/to/bunch*2' ; do
stat "$fileglob" | awk [aggregation]
done
私はあなたが何を達成しようとしているのかわからないので、これをテストしませんでしたが、同様のテストを実行しました。
引用なし
for a in a* b*; do
echo $a
done
出力
$ ./test.sh
abc
ade
atlmfc.zip
bce
bin
引用符を含める
for a in 'a*' 'b*'; do
echo $a
done
出力
$ ./test.sh
abc ade atlmfc.zip
bce bin
デフォルトでは、globはループではなくエコーとして解釈されます。したがって、各グローブごとに1つずつ2行の出力があります。