内部ファイルではなくglobパターンを繰り返します。

内部ファイルではなくglobパターンを繰り返します。

各ファイルセットがグローバルパターンと一致する複数のファイルセットのそれぞれに対して、同じ集計操作を実行したいと思います。私が望んでいないのは、各ファイル名を個別に集計関数にパイプすることです。

最初の試みは失敗しました。外部ループでは、ファイル名がワイルドカードとして指定され、コレクション全体を別々のバッチとして処理するのではなく、単純なリストにマージしたためです。

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

おすすめ記事