内部ファイルではなく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

答え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行の出力があります。

関連情報