【问题标题】:bash scripting: parallel for loopsbash 脚本:并行 for 循环
【发布时间】:2011-11-07 16:11:55
【问题描述】:

我正在编写一个 bash 脚本来循环遍历 2 个相同的目录树,以便在匹配的文件上运行差异。我只需要知道设置 2 个并行运行的循环的正确语法是什么。我还想递归地遍历目录,所以如果有一个额外的步骤来完成这个,你能提一下吗?

#!/bin/bash
FILES1=/path/to/one
FILES2=/path/to/two
for f1 in $FILES1; f2 in $FILES2
do
  echo "Processing $f1 $f2 file..."
done

【问题讨论】:

  • 您是否真的想用 $FILES2 中的第一个文件处理 $FILES1 中的第一个文件,然后使用 $FILES2 中的第一个文件处理第二个文件,依此类推,或者 $FILES1 中的每个文件与 $FILES2 中的每个文件(即交叉产品)?
  • diff -Naur /path/to/one /path/to/two 有什么问题?
  • 保罗,我想要前者:第一和第二,等等。
  • @ted,你确定它们总是以相同的方式排序吗?
  • jamessan,你以最好的方式解决了我的问题,单线。您为什么不将其发布为答案?我会留下这个问题,因为它是 b/c 循环问题可能对其他人有用。

标签: bash for-loop


【解决方案1】:

diff 已经具有针对目录递归运行的内置功能。你可以运行diff -Naur /path/to/one /path/to/two

  • -N 将显示新文件的差异,而不是仅仅说它存在于第二个路径中
  • -a 将所有文件视为文本,因此您可能需要也可能不需要。
  • -u 使用通用的统一差异格式
  • -r 是重要的,在这种情况下是递归标志

【讨论】:

    【解决方案2】:

    不保证两个目录中的文件顺序相同。

    这样做:

    FILES1=/path/to/one
    FILES2=/path/to/two
    for f1 in $FILES1/*
    do
      f2=$FILES2/`basename f1`
      # ...
    done
    

    如果您需要递归执行:

    cd $FILES1
    for f1 in `find`; do
      f2=$FILES2/$f1
      # ...
    done
    

    【讨论】:

      【解决方案3】:

      你能得到的最接近的是嵌套for循环,即

         for f in $FILES1 ; do
            for f2 in $FILES2 ; do
               if [ ${f##*/} = ${f2##*/} ]; then
                   diff $f $f2
                   break
               fi
            done
        done
      

      要遍历递归目录,您可以依靠 find 返回要处理的文件列表

       PATH1=/path/to/one
       PATH2=/path/to/two
      
       for f in $(find $PATH1 -print ) ; do
          for f2 in $(find $PATH2 -print ) ; do
             if [ ${f##*/} = ${f2##*/} ]; then
                 diff $f $f2
                 break
             fi
          done
      done
      

      抱歉,我现在没有办法对此进行测试,${f##*/} 可能并不完全正确。目的是只创建一个文件的基本名称(我想你也可以使用它,$(basename $f ),但每个进程都需要 2 个进程。

      这两个都是非常昂贵的过程,检查大量不匹配的文件名对。 loop2 内部的 break 有点帮助。

      另一种解决方案是依靠一个路径来创建驱动程序列表,然后使用提供的名称来生成替代的相对路径,即

      for f in $FILES1 ; do
         f2=../two/$f{##*/}
         if [ -f ${f2} ] ; the
             diff $f $f2
         else
             printf "no alternate file found in ../two for f=${f}"
         fi
      done
      

      如果需要,您可以复制该循环并反转 f2 和 f 的位置以检查系统的“另一端”。

      我希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-07
        • 1970-01-01
        • 1970-01-01
        • 2017-04-17
        • 1970-01-01
        相关资源
        最近更新 更多