在 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 版本就不会出现这种情况。
我有一个脚本 "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 版本就不会出现这种情况。