LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 859|回复: 7

文件夹同步

[复制链接]
发表于 2003-12-18 00:44:37 | 显示全部楼层 |阅读模式
我有两个文件夹(带有子文件夹),文件大多相同,其中一个(A)里面有的文件比较新,还有添加或者删除,我现在想把另一个(B)也同步到A的状态,要求只更新需要更新的文件,不知道应该怎么样写script完成?linux下有个rsync命令似乎可以完成类似功能,不过是远程使用的,我只需要本地跑,请大家帮忙。
发表于 2003-12-18 01:29:34 | 显示全部楼层
这样思路不知道是否可行?
1,用diff -r dirA dirB来比较这两个目录.
2,当有产生不同文件的时候,以dirA目录为准,用cp ~/dirA/* ~/dirB来覆盖一下dirB目录
3,写成文件放在后台运行
或者:
用find /dirA -type f -mmin n找出n分钟前修改过的文件,再cp过去,即在脚本中:
cp $(find /dirA -type f -mmin n) /dirB
发表于 2003-12-18 09:24:19 | 显示全部楼层
为什么不用连接呢
发表于 2003-12-23 14:09:03 | 显示全部楼层
算法:
1.先find /pathname -print >filea #获取两个文件夹里所有文件的全名。
2,比较文件,先删去要同步的文件夹里多余的文件。
3.比较文件,把原文件夹里增加的文件CP到要同步的文件夹中。

现在遇到问题是:
怎么用comm,这么命令的参数是-1 -2 -3 较难描述,请大家自己是用一下这个命令吧。



写了个只能增加,不能删除的脚本,对于这个主题,仅当参考:

#!/bin/bash
mount /mnt/d 2>/dev/null#挂载文件系统
unalias cp 2>/dev/null #这里能恢复命令本来的参数的意义,详细请看man unalias
cd /share/c/app ; rm *o *core a.out 2>/dev/null#删去多余的文件
ls >/tmp/A ; ls /mnt/d/share/c/app >/tmp/B #获取所有的文件名
count=0
for i in $(diff /tmp/A /tmp/B |grep "<"|awk '{print $2}') #得出不同的文件名
do
cp $i /mnt/d/share/c/app/#复制文件
count=$((count+1)) #计数
done
echo "copied $count c program file "
cd /share/src/
ls >/tmp/A ; ls /mnt/d/share/src/ >/tmp/B
count=0
for i in $(diff /tmp/A /tmp/B|grep "<"|awk '{print $2}')
do
cp $i /mnt/d/share/src/
count=$((count+1))
done
echo "copied $count bash scritp file" ; sync
umount /mnt/d
echo done


要注意:这个脚本只能处理当前目录里的普通文件。
发表于 2003-12-23 14:34:12 | 显示全部楼层
develMM的脚本很不错~,谢谢~ :thank
comm命令用于两个已经排序后的文件进行逐行比较,具体用法:
comm -1|-2|-3 Leftfile Rightfile
-1:不显示仅在Leftfile中存在的行
-2:不显示仅在Rightfile中 存在的行
-3:不显示在Leftfiel和Rightfile中都存在的行
这三个参数也可以组合使用:
comm -23 fileA fileB #显示文件fileA中存在而在fileB中不存在的行
发表于 2003-12-23 22:13:25 | 显示全部楼层
谢谢JAVALEE的帮助。
算法:
1.先find /pathname -print >filea #获取两个文件夹里所有文件的全名。
2,比较文件,先删去要同步的文件夹里多余的文件。接着重新获得需要同步的文件夹里所有文件的全名。
3.比较文件,把源文件夹里增加的文件CP到要同步的文件夹中。

这个脚本是同步/share目录里的所有文件,需要备份到/mnt/d/share

#!/bin/bash
mount /dev/hda6 /mnt/d 2>/dev/null ; unalias rm cp
rm /share/c/app/*o /share/c/tmp/*o /share/c/app/*core /share/c/tmp/*core /share/c/app/a.out /share/c/tmp/a.out
find /share -print >/tmp/.share_#把/share的所有文件的全名保存到/tmp/.share_
find /mnt/d/share -print |sed 's/\/mnt\/d//g' >/tmp/.d_
chmod 700 /tmp/.share_ /tmp/.d_
count=0
for i in $(comm -23 /tmp/.d_ /tmp/.share_) ; do #比较两个文件里/tmp.d_ 与/tmp./share_的不同。
echo "/mnt/d$i"
rm   "/mnt/d$i" ; count=$((count+1))#删除/mnt/d/share/*里的多余的文件和计数。
done#for command ;do command ; done的循环到此结束。
echo "del $count file at /mnt/d/share/"
find /mnt/d/share -print |sed 's/\/mnt\/d//g' >/tmp/.d_ ; count=0#重新获得文件的全名。初始化计数器。
for i in $(comm -23 /tmp/.share_ /tmp/.d_) ; do
echo $i
cp   $i "/mnt/d$i" ; count=$((count+1))#备份/share里新增加的文件到/mnt/d/share,同时计数。
done
echo "already copied $count file from /share to /mnt/d/share " ;sync
umount /mnt/d 2>/dev/null
echo done
发表于 2003-12-23 22:23:31 | 显示全部楼层
精彩~~,已经收藏到[脚本欣赏区]...:thank
发表于 2003-12-23 22:34:12 | 显示全部楼层
最初由 javalee 发表
精彩~~,已经收藏到[脚本欣赏区]...:thank


谢谢你~~提供关键的命令 (comm -23) !!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表