0

I'm trying to write a bash shell script to sync content on two different paths.

The algorithm I'm striving for consists of the following steps

  1. given two full (as opposed to relative) paths
  2. recursively compare files (whose filename optionally may have basename and suffix) in corresponding directories of both paths
  3. if either corresponding directories or files are not present, then copy each file (from the path with the folder) to the other corresponding folder.

I've figured out steps 1 and 2 which are

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

Thanks.

4

2 回答 2

1

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

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

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

    你可能想看看你的shell(例如for bash)或test命令支持的条件表达式。我还建议使用cmp而不是diff.

    注意:当您在一侧有一个目录而在另一侧有一个同名文件时,您需要考虑正确的操作应该是什么。

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

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

编辑:

我忘了提到一个重要的优化:如果你事先sort列出了文件列表A.lst,你可以使用而不是执行设置操作:B.lstcommcat ... | 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

于 2012-07-28T19:48:57.247 回答
0

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

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

干杯

于 2019-10-30T12:39:06.047 回答