Bash脚本以递归方式遍历目录,比较和同步文件

时间:2012-07-28 19:14:08

标签: shell

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

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

  1. 给出两个完整(相对于相对)路径
  2. 递归地比较文件(其文件名可选地具有 basename和suffix)在两个路径的相应目录中
  3. 如果相应的目录或文件不存在,那么 将每个文件(从文件夹的路径)复制到另一个文件 相应的文件夹。
  4. 我已经找到了第1步和第2步

    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
    

    感谢。

2 个答案:

答案 0 :(得分:1)

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

  1. 检索目录A和B的列表,例如A.lstB.lst

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

    您可能希望查看shell支持的条件表达式(例如bash)或test命令。我还建议使用cmp代替diff

    注意:当你的一面有一个目录而另一面有一个同名的文件时,你需要考虑应该采取什么样的行动。

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

  4. 同样,找到仅存在于B中的文件,并将它们递归复制到A.

  5. 修改

    我忘了提及重要优化:如果您sort文件事先列出了A.lstB.lst,则可以使用comm代替cat ... | sort | uniq ...执行设置操作:

    • 交点:comm -12 A.sorted.lst B.sorted.lst

    • 仅存在于A:comm -23 A.sorted.lst B.sorted.lst

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

答案 1 :(得分:0)

有一个基于查找(也使用与您相同的想法)的现成解决方案(shell脚本)来同步两个目录:https://github.com/Fitus/Zaloha.sh

文档在这里:https://github.com/Fitus/Zaloha.sh/blob/master/DOCUMENTATION.md

欢呼