2012-07-28 280 views
0

我想写一个bash shell脚本来同步两个不同路径上的内容。Bash脚本递归遍历目录,比较和同步文件

我追求的算法包括以下步骤

  1. 给出两个完整的(而不是相对)路径
  2. 递归的比较文件(即文件名可任选有 基本名和后缀)两个路径的相应目录
  3. 如果对应的目录或文件不存在,则 将每个文件(从文件夹路径)复制到其他 对应的文件夹。

我已经想通了步骤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 

感谢。

+3

为什么不使用像'rsync',而不是写能力较差你自己的东西吗? – thkala 2012-07-28 19:20:51

+1

自学。试图学习如何编写bash脚本。但这不是一项家庭作业。 – 2012-07-28 19:24:18

+0

这很好 - 步骤3中的确切问题是什么? – thkala 2012-07-28 19:29:21

回答

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存在和递归地将其复制到文件。

编辑:

我忘了提一个显著的优化:如果你sort文件列表A.lstB.lst事先,你可以使用comm代替cat ... | sort | uniq ...执行组操作:

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

  • 文件只存在答:comm -23 A.sorted.lst B.sorted.lst

  • 文件只存在于B:comm -13 A.sorted.lst B.sorted.lst

+0

谢谢,将尝试出来,并在工作时报告。 – 2012-07-28 19:52:29