Shell Bash脚本递归遍历目录、比较和同步文件

Shell Bash脚本递归遍历目录、比较和同步文件,shell,Shell,我正在尝试编写一个bashshell脚本来同步两个不同路径上的内容 我正在努力寻找的算法包括以下步骤 给定两条完整(相对于相对)路径 递归比较文件(其文件名可能有 basename和后缀)在两个路径的相应目录中 如果相应的目录或文件不存在,则 将每个文件(从文件夹路径)复制到另一个文件 对应的文件夹 我已经找出了第一步和第二步 OLD_IFS=$IFS # The extra space after is crucial IFS=\ for old_file in `diff -rq old/

我正在尝试编写一个bashshell脚本来同步两个不同路径上的内容

我正在努力寻找的算法包括以下步骤

  • 给定两条完整(相对于相对)路径
  • 递归比较文件(其文件名可能有 basename和后缀)在两个路径的相应目录中
  • 如果相应的目录或文件不存在,则 将每个文件(从文件夹路径)复制到另一个文件 对应的文件夹
  • 我已经找出了第一步和第二步

    OLD_IFS=$IFS
    # The extra space after is crucial
    IFS=\
    
    for old_file in `diff -rq old/ new/ | grep "^Files.*differ$" | sed 's/^Files \(.*\) and .* differ$/\1/'`
    do
       mv $old_file $old_file.old
    done
    IFS=$OLD_IFS
    

    谢谢。

    我用Java实现了一个类似的算法,基本上可以归结为:

  • 检索目录a和B的列表,例如
    a.lst
    B.lst

  • 创建两个列表的名称(例如,cat A.lst B.lst | sort | uniq-d)。这是您需要实际比较的文件列表;您还必须递归地下降到任何目录

    您可能需要查看shell(例如for)或命令支持的条件表达式。我还建议使用
    cmp
    而不是
    diff

    注意:当一个目录有一个目录,另一个文件具有相同的名称时,你需要考虑正确的动作应该是什么。

  • 查找仅存在于A中的文件(例如,cat A.lst B.lst B.lst B.lst | sort | uniq-u)并将其递归复制到B中

  • 类似地,找到仅存在于B中的文件,并将其递归复制到A

  • 编辑:

    我忘了提到一个重要的优化:如果您
    sort
    文件事先列出
    a.lst
    B.lst
    ,您可以使用而不是
    cat…|排序| uniq…
    以执行设置操作:

    • 交叉点:
      comm-12a.sorted.lst B.sorted.lst

    • 仅存在于A:
      comm-23 A.sorted.lst B.sorted.lst中的文件

    • 仅存在于B:
      comm-13 A.sorted.lst B.sorted.lst中的文件


    有一个现成的解决方案(shell脚本),基于查找(也使用与您相同的想法),用于同步两个目录:

    文档位于此处:


    干杯

    为什么不使用类似于
    rsync
    的东西,而不是自己写一些能力较弱的东西呢?自学。尝试学习如何编写bash脚本。但这不是家庭作业。没关系-第3步的具体问题是什么?我很难想出第3步的算法。
    grep
    后跟
    sed
    是对CPU周期的浪费。只需使用sed-e'/pattern/s/from/to/'
    。这个答案很好。我赞成保留。你不能期望这张海报能够识别并张贴一个程序中不属于他们的关键部分。尤其是当他们只想说“看,省省你的工作吧,那边的这个可以用了”