linux shell 编程如何实现两个文件的同步。
例如:有A和B两个文件夹,如果A中的文件最近有更新,就把它复制到B。希望能给出些代码,本人刚学shell编程,很多都不懂。谢谢了...
例如:有A和B两个文件夹,如果A中的文件最近有更新,就把它复制到B。
希望能给出些代码,本人刚学shell编程,很多都不懂。谢谢了 展开
希望能给出些代码,本人刚学shell编程,很多都不懂。谢谢了 展开
5个回答
展开全部
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命令才能同步,不能做到及时更新
这是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命令才能同步,不能做到及时更新
推荐于2016-06-22 · 知道合伙人互联网行家
关注
展开全部
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
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
给个我自己的方向给你,如果你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里面执行。
具体你自己琢磨。
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里面执行。
具体你自己琢磨。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
没有其它特殊需求的话,下面这一行命令就能完成你的工作
rsync -avz /yourpath/A /yourpath/B
有空可以man rsync一下
rsync -avz /yourpath/A /yourpath/B
有空可以man rsync一下
追问
如果用遍历的思想如何实现。即需要对A和B中的文件进行遍历,然后进行判断。用程序如何实现。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
man rsync 看看它的帮助
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询