没有任何改变时rsync inode差异

时间:2014-01-23 20:19:40

标签: linux bash rsync

我创建了一个简单的bash脚本,它创建了三个目录,我可以在rsync中检查目标inode。

脚本在这里:

#!/bin/bash

function dorsync()
{
RSYDIR=$DST/$1
#rm -r $RSYDIR

echo "rsync -azP --delete --delete-excluded --link-dest=$LNKDSTDIR $SRC/ $RSYDIR" >> $LOG
rsync -azP --delete --delete-excluded --link-dest=$LNKDSTDIR $SRC/ $RSYDIR
rm -f ${LNKDSTDIR}
ln -sf ${RSYDIR} ${LNKDSTDIR}
echo "-----" >> $LOG
ls -li $DST/$1 >> $LOG
echo "-----" >> $LOG
cat $DST/$1/a.txt >> $LOG 
cat $DST/$1/b.txt >> $LOG
#du $DST >> $LOG 
echo "===================================================================" >> $LOG
}

SRC=~/tmp/src
DST=~/tmp/dst
LOG=~/tmp/log.txt
LNKDSTDIR=${DST}/Current

echo "SRC=$SRC"
echo "DST=$DST"
echo "LOG=$LOG"
echo "LNKDSTDIR=$LNKDSTDIR"


rm -R "$SRC"
rm -R "$DST"
rm $LOG

mkdir $SRC
mkdir $DST

echo "echo 'A0' > $SRC/a.txt" >> $LOG
echo "A0" > $SRC/a.txt

dorsync d0


echo "***********************************************************" >> $LOG
echo "echo 'A1' > $SRC/a.txt" >> $LOG
echo "A1" >> $SRC/a.txt

dorsync d1


echo "***********************************************************" >> $LOG
echo "echo 'B0' > $SRC/b.txt" >> $LOG
echo "B0" > $SRC/b.txt

dorsync d2



echo "***********************************************************" >> $LOG
echo "echo 'A2' > $SRC/a.txt" >> $LOG
echo "A2" >> $SRC/a.txt

dorsync d0



echo "***********************************************************" >> $LOG
echo "no change" >> $LOG

dorsync d1

echo "***********************************************************" >> $LOG
echo "no change" >> $LOG

dorsync d2

脚本的结果如下所示:

echo 'A0' > /home/pi/tmp/src/a.txt
rsync -azP --delete --delete-excluded --link-dest=/home/pi/tmp/dst/Current /home/pi/tmp/src/ /home/pi/tmp/dst/d0
-----
total 4
399342 -rw-r--r-- 1 pi pi 3 Jan 22 22:15 a.txt
-----
A0
===================================================================
***********************************************************
echo 'A1' > /home/pi/tmp/src/a.txt
rsync -azP --delete --delete-excluded --link-dest=/home/pi/tmp/dst/Current /home/pi/tmp/src/ /home/pi/tmp/dst/d1
-----
total 4
399356 -rw-r--r-- 1 pi pi 6 Jan 22 22:15 a.txt
-----
A0
A1
===================================================================
***********************************************************
echo 'B0' > /home/pi/tmp/src/b.txt
rsync -azP --delete --delete-excluded --link-dest=/home/pi/tmp/dst/Current /home/pi/tmp/src/ /home/pi/tmp/dst/d2
-----
total 8
399356 -rw-r--r-- 2 pi pi 6 Jan 22 22:15 a.txt
399359 -rw-r--r-- 1 pi pi 3 Jan 22 22:15 b.txt
-----
A0
A1
B0
===================================================================
***********************************************************
echo 'A2' > /home/pi/tmp/src/a.txt
rsync -azP --delete --delete-excluded --link-dest=/home/pi/tmp/dst/Current /home/pi/tmp/src/ /home/pi/tmp/dst/d0
-----
total 8
399360 -rw-r--r-- 1 pi pi 9 Jan 22 22:15 a.txt
399359 -rw-r--r-- 2 pi pi 3 Jan 22 22:15 b.txt
-----
A0
A1
A2
B0
===================================================================
***********************************************************
no change
rsync -azP --delete --delete-excluded --link-dest=/home/pi/tmp/dst/Current /home/pi/tmp/src/ /home/pi/tmp/dst/d1
-----
total 8
399347 -rw-r--r-- 1 pi pi 9 Jan 22 22:15 a.txt
399359 -rw-r--r-- 3 pi pi 3 Jan 22 22:15 b.txt
-----
A0
A1
A2
B0
===================================================================
***********************************************************
no change
rsync -azP --delete --delete-excluded --link-dest=/home/pi/tmp/dst/Current /home/pi/tmp/src/ /home/pi/tmp/dst/d2
-----
total 8
399361 -rw-r--r-- 1 pi pi 9 Jan 22 22:15 a.txt
399359 -rw-r--r-- 3 pi pi 3 Jan 22 22:15 b.txt
-----
A0
A1
A2
B0
===================================================================

我的问题是为什么在两个最后一次运行inode for a.txt不是399360而不是399347和399361?

问候。

3 个答案:

答案 0 :(得分:0)

这是因为--link-dest指定了rsync应查找相同文件的目录。

您永远不会向其中写入文件,因此它不包含要链接的相同文件。因此,rsync不会链接,导致文件名具有不同的inode。

答案 1 :(得分:0)

在我的情况下,src目录中的文件与d0相同。 如果我使用--link-dest d0从src到d1,我会期望在d1中我将拥有与d0相同的inode,因为没有任何改变。

如果查看文件b.txt,您会看到当没有变化(3.和4.迭代)时,inode 399359是相同的。 我只是徘徊为什么sambe行为不是a.txt。

据我了解rsync,如果源目录中的文件在--link-dest目录中相同,只需在目标目录中添加硬链接即可。 如果文件已更改,则发送增量数据并创建新的inode。

问候。

答案 2 :(得分:0)

  

rsync(1) - Linux手册页

     

选项

- link-dest = DIR

...

     

此选项在复制到空目的地时效果最佳   层次结构,因为rsync将现有文件视为最终文件(因此永远不会   已经在目标文件中查找link-dest dirs   存在)...

在最近两次运行中,a.txt已存在于目标目录中。