【问题标题】:Implement a bash script on a group of files in increments [duplicate]以增量方式在一组文件上实现 bash 脚本 [重复]
【发布时间】:2015-09-04 01:00:03
【问题描述】:

对不起,如果这是一个基本问题,但我才刚刚开始,我有点迷路。我有一组大约 3000 个要运行命令的文件。不幸的是,命令来自的程序(morphadorner)一次只能在 8 个文件上运行。文件是连续编号的。如何让程序每 8 个文件迭代一次,以便处理文件夹中的所有文件?

【问题讨论】:

    标签: linux bash


    【解决方案1】:

    假设您的文件被称为file01file02...file64,那么您可以使用GNU Parallel 像这样处理它们:

    parallel -j 1 -n 8 echo {1} {2} {3} {4} {5} {6} {7} {8} ::: file*
    

    输出会是这样的:

    file001 file002 file003 file004 file005 file006 file007 file008
    file009 file010 file011 file012 file013 file014 file015 file016
    file017 file018 file019 file020 file021 file022 file023 file024
    file025 file026 file027 file028 file029 file030 file031 file032
    file033 file034 file035 file036 file037 file038 file039 file040
    file041 file042 file043 file044 file045 file046 file047 file048
    file049 file050 file051 file052 file053 file054 file055 file056
    file057 file058 file059 file060 file061 file062 file063 file064
    

    当然,我只是在呼应参数,你想必会调用morphadorner

    -j 1 表示一次只运行一个 morphadorner - 如果您有 8 个 CPU 内核,您可能希望忽略这一点并允许说一次运行 8 个 morphadorners

    -n 8 表示每次使用 8 个参数/文件。

    {1} 是第一个参数的占位符,{2} 是第二个参数的占位符,依此类推。

    ::: 是一个分隔符,它告诉GNU Parallel 参数即将跟随。

    【讨论】:

      【解决方案2】:

      看看这段代码:

          files=(*)
          count=${#files[@]}
          limit=8
          echo "Processing $count files: ${files[@]}"
      
          while [ $count -gt 0 ] ; do
                  count=$((count-8))
                  [ $count -lt 0 ] && limit=$((limit+count)) && count=0
                  part=("${files[@]:$count:$limit}")
                  echo $count-$((count+limit)): "${part[@]}"
          done
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-04
        • 1970-01-01
        • 1970-01-01
        • 2021-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多