迭代 glob 模式,而不是其中的文件

WAF*_*WAF 3 bash shell-script wildcards for

我想对几束文件中的每一束执行相同的聚合操作,其中每一束都与一个 glob 模式匹配。我不想做的是将每个文件名分别通过管道传输到聚合函数中。

我的第一次尝试失败了,因为文件名在外循环中被打乱,将整个集合展平为一个平面列表,而不是将它们视为单独的批次:

for fileglob in /path/to/bunch*1 /path/to/bunch*2 ... ; do
  stat "$fileglob" | awk [aggregation]
done
Run Code Online (Sandbox Code Playgroud)

所以我*通过转义它从循环中隐藏了它,然后为函数取消了它:

for fileglob in /path/to/bunch*1 /path/to/bunch*2 ... ; do
  realglob=`echo "$fileglob" | sed 's/\\//g'`
  stat "$realglob" | awk [aggregation]
done
Run Code Online (Sandbox Code Playgroud)

一定有更好的方法。它是什么?

GNU bash,版本 3.2.51

小智 6

这需要谨慎使用引号:

for fileglob in '/path/to/bunch*1' '/path/to/bunch*2' ... ; do
    stat $fileglob | awk [aggregation]
done
Run Code Online (Sandbox Code Playgroud)

但是对于带有空格(或换行符)的文件名,这可能会失败。最好使用这个:

fileglobs=("/path/to/bunch*1" "/path/to/bunch*2")

for aglob in "${fileglobs[@]}" ; do
    set -- $aglob
    stat "$@" | awk [aggregation]
done
Run Code Online (Sandbox Code Playgroud)

glob 被正确扩展并放置在位置参数中:

set -- $aglob
Run Code Online (Sandbox Code Playgroud)

然后,将每个参数作为参数放置到statin:

stat "$@"
Run Code Online (Sandbox Code Playgroud)

并且输出stat(作为一个输出)到awk.