各ファイルセットがグローバルパターンと一致する複数のファイルセットのそれぞれに対して、同じ集計操作を実行したいと思います。私が望んでいないのは、各ファイル名を個別に集計関数にパイプすることです。
最初の試みは失敗しました。外部ループでは、ファイル名がワイルドカードとして指定され、コレクション全体を別々のバッチとして処理するのではなく、単純なリストにマージしたためです。
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
。