在 bash 命令中使用 seq

using seq in bash commands

我有一个脚本 "epsmat_hdf5_merge.py" 可以合并多个文件的内容。但是,这些文件位于各自的文件夹中,每个文件夹都以一个数字 (0001 0002 ...) 命名。我用的是最原始的方法来识别文件夹中的文件:

epsmat_hdf5_merge.py q0001/eps0mat.h5 q0002/eps0mat.h5 q0003/eps0mat.h5 0004/eps0mat.h5 q0005/eps0mat.h5 q0006/eps0mat.h5 q0007/eps0mat.h5 q0008/eps0mat.h5 q0009/eps0mat.h5 q0010/eps0mat.h5

注意这里的命令是"epsmat_hdf5_merge.py"后面是各自文件夹中的所有.h5文件。

我不能使用简单的 seq 循环,因为

for i in seq`1 999`
do
epsmat_hdf5_merge.py q$i/eps0mat.h5

将简单地执行以下操作:

    epsmat_hdf5_merge.py q0001/eps0mat.h5
    epsmat_hdf5_merge.py q0002/eps0mat.h5
    epsmat_hdf5_merge.py q0003/eps0mat.h5
...

这只是一个文件,后跟 .py 脚本。因此,合并脚本无法在任何步骤合并任何内容。

知道如何处理这个吗?

尾注:

此外,如果我们现在将文件夹总数 (999) 更改为变量 (var),考虑到括号扩展在管理 $var 时遇到问题,语法会怎样?

大括号扩展。

for i in q{0001..999}; do 
  echo epsmat_hdf5_merge.py $i/eps0mat.h5
done

使用find进行批量处理。 bash4+

find q{0001..999}/ -type f -name '*.h5' -exec echo epsmat_hdf5_merge.py {} +

如果你的 bash 低于 bash4+ 试试。

find q[0-9][0-9][0-9][0-9]/ -type f -name '*.h5' -exec echo epsmat_hdf5_merge.py {} +

编辑:如评论中所述,

中使用了 variable
{0001..999}  

{0001..$var}

但是它在 bash 中不起作用,afaik 它只在 zsh 上起作用,因为大括号扩展发生在变量扩展之前。

解决方法是使用 c 风格的 for 循环。

var=999
array=()

for ((i = 1; i <= var; i++)); do
  printf -v num '%04d' "$i"
  array+=("q$num/")
done

find "${array[@]}" -type f -name '*.h5' -exec echo epsmat_hdf5_merge.py {} +
  • 如果您喜欢输出结果,请删除 echo

不确定,但我想你正在寻找

epsmat_hdf5_merge.py q{0001..0030}/eps0mat.h5

您应该将 0001 和 0030 调整为您感兴趣的实际数字。还有用于缺失数字或额外数字的选项。只要大括号扩展有效,旧 bash 版本就不会出现这种情况。