linux shell 编程如何实现两个文件的同步。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux shell 编程如何实现两个文件的同步。相关的知识,希望对你有一定的参考价值。

例如:有A和B两个文件夹,如果A中的文件最近有更新,就把它复制到B。
希望能给出些代码,本人刚学shell编程,很多都不懂。谢谢了

ln
这是linux中一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同不的链接,这
个命令最常用的参数是-s,具体用法是:ln -s 源文件 目标文件。
当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在其它的目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间。例
如:ln -s /bin/less /usr/local/bin/less
-s 是代号(symbolic)的意思。
这里有两点要注意:
第一,ln命令会保持每一处链接文件的同步性,也就是说,不论你改动了哪一处,其它的文件都会发生相同的变化;
第二,ln的链接又软链接和硬链接两种,软链接就是ln -s ** **,它只会在你选定的位置上生成一个文件的镜像,不会占用磁盘空间,硬链接ln ** **,没有参数-s, 它会在你选定的位置上生成一个和源文件大小相同的文件,无论是软链接还是硬链接,文件都保持同步变化。
第三,软链接是可以跨分区的,但是硬链接只能在同一分区内。
如果你用ls察看一个目录时,发现有的文件或文件夹的颜色和别的不一样,我机子上是蓝色的,那就是一个用ln命令生成的文件,用ls -l命令去察看,就可以看到显示的link的路径了。

如果用rsync命令,你必须手动执行rsync命令才能同步,不能做到及时更新
参考技术A

Linux系统下实现文件同步的shell脚本,代码如下:

#!/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

参考技术B 给个我自己的方向给你,如果你AB2个文件夹都相同的话
DIRA=`ls -l A | awk 'print $6' | sort` //看A目录下文件时间,并排序,把内容赋值到变量DIRA
DIRB=`ls -l B | awk 'print $6' | sort` //看A目录下文件时间,并排序,把内容赋值到变量DIRB
diff $DIRA $DIRB | grep “<" //对比2个文件。
.......
然后进行处理,需要弄一个shell程序,然后放在crontab里面执行。
具体你自己琢磨。
参考技术C 没有其它特殊需求的话,下面这一行命令就能完成你的工作
rsync -avz /yourpath/A /yourpath/B
有空可以man rsync一下追问

如果用遍历的思想如何实现。即需要对A和B中的文件进行遍历,然后进行判断。用程序如何实现。

参考技术D man rsync 看看它的帮助

以上是关于linux shell 编程如何实现两个文件的同步。的主要内容,如果未能解决你的问题,请参考以下文章

linux shell编程问题

如何使2台Linux服务器通过FTP自动同步文件?(用Shell脚本)

在UNIX shell编程里如何比较两个文件哪个修改的时间晚些!急谢谢!

linux虚拟机下bash shell编程,制作一个音乐播放器,可以实现用代码打开mp3文件吗?

linux系统编程--线程同步

2个linux服务器间通过ftp同步文件的shell脚步,需要shell脚步,最好能加一点注释。谢谢