【问题标题】:using seq in bash commands在 bash 命令中使用 seq
【发布时间】:2020-03-24 09:32:13
【问题描述】:

我有一个脚本“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,语法会如何?

【问题讨论】:

  • 您能否发布一个如您所描述的那样工作的代码?当前文档没有按照您所说的那样做,因此我们无法就任何改进提出建议,因为我们不知道您在做什么。
  • 再一次,您发布的代码并没有按照您说的那样做。请发布您使用的真实代码以获得实际结果和预期结果。
  • 我使用的实际代码是第一组,它得到了我想要的,但它很笨拙。第二个代码字段是我想要的一般概念,但它不起作用,因为它没有将所有 xxx/eps0mat.h5 集中在一个 epsmat_hdf5_merge.py 后面。看不到哪个部分不清楚..

标签: bash seq


【解决方案1】:

不确定,但我认为您正在寻找

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

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

【讨论】:

    【解决方案2】:

    大括号扩展。

    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 {} +
    

    编辑:正如 cmets 中提到的,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

    【讨论】:

    • 感谢 Jetchisel,但此命令仍在执行 epsmat_hdf5_merge.py 0001/eps0mat.h5 ;epsmat_hdf5_merge.py 0002/eps0mat.h5;.... 而不是 epsmat_hdf5_merge.py 0001/eps0mat.h5 0002/eps0mat.h5 .....
    • 您想一次性处理所有内容吗?
    • 是的。该脚本本质上是合并命令中给出的所有文件
    • 请更新您的问题并添加并说明您想要做什么。
    • 更新了问题以澄清问题。你介意解释一下 find 命令的每个部分的作用吗?它没有显示任何输出并试图了解哪个部分不起作用。
    猜你喜欢
    • 1970-01-01
    • 2011-08-26
    • 2017-11-25
    • 2012-11-16
    • 2013-10-03
    • 1970-01-01
    • 2023-04-08
    • 2018-05-31
    • 2018-11-08
    相关资源
    最近更新 更多