我正在尝试编写一个bash shell脚本来同步两个不同路径上的内容。
我正在努力的算法包括以下步骤
我已经找到了第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
感谢。
答案 0 :(得分:1)
我在Java中实现了一个类似的算法,基本上归结为:
检索目录A和B的列表,例如A.lst
和B.lst
创建两个商家信息的intersection(例如cat A.lst B.lst | sort | uniq -d
)。这是您需要实际比较的文件列表;你还必须递归地下降到任何目录。
您可能希望查看shell支持的条件表达式(例如bash
)或test
命令。我还建议使用cmp
代替diff
。
注意:当你的一面有一个目录而另一面有一个同名的文件时,你需要考虑应该采取什么样的行动。
查找仅存在于A中的文件(例如cat A.lst B.lst B.lst | sort | uniq -u
)并将其递归复制(cp -a
)至B.
同样,找到仅存在于B中的文件,并将它们递归复制到A.
修改强>
我忘了提及重要优化:如果您sort
文件事先列出了A.lst
和B.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。
欢呼