2016-09-08 32 views
2

我想将“sdir”目录根据当天的情况复制(rsync)到tdir目录。我想要一个完整的副本到mon目录,只改变了什么,只改变了什么,等等,但我没有得到我需要的结果。 参考实际的命令我跑:Rsync备份一个源目录,并再次检查多个目录

[[email protected] test]$ tree 
. 
├── sdir 
│ ├── file1 
│ ├── file2 
│ ├── file3 
│ ├── file4 
│ └── file5 
└── tdir 
    ├── fri 
    ├── mon 
    │ ├── file1 
    │ └── file2 
    ├── thu 
    ├── tue 
    │ └── file3 
    └── wed 
     ├── file3 
     ├── file4 
     └── file5 

7 directories, 11 files 
[[email protected] test]$ touch sdir/file6 
[[email protected] test]$ rsync -av --dry-run sdir/ --compare-dest=/home/jesse/test/tdir/mon/ /home/jesse/test/tdir/tue/ /home/jesse/test/tdir/wed/ /home/jesse/test/tdir//thu/ --backup-dir=/home/jesse/test/tdir/fri/ 
sending incremental file list 
./ 
file3 
file4 
file5 
file6 

sent 294 bytes received 31 bytes 650.00 bytes/sec 
total size is 0 speedup is 0.00 (DRY RUN) 
[[email protected] test]$ rsync -av --dry-run sdir/ --compare-dest=/home/jesse/test/tdir/mon/ /home/jesse/test/tdir/tue/ /home/jesse/test/tdir/wed/ /home/jesse/test/tdir//thu/ --backup-dir=/home/jesse/test/tdir/thu/ 
sending incremental file list 
./ 
file3 
file4 
file5 
file6 

sent 294 bytes received 31 bytes 650.00 bytes/sec 
total size is 0 speedup is 0.00 (DRY RUN) 
[[email protected] test]$ rsync -av --dry-run sdir/ --compare-dest=/home/jesse/test/tdir/mon/ /home/jesse/test/tdir/tue/ /home/jesse/test/tdir/wed/ --backup-dir=/home/jesse/test/tdir/thu/ 
sending incremental file list 
./ 
file6 

sent 208 bytes received 22 bytes 460.00 bytes/sec 
total size is 0 speedup is 0.00 (DRY RUN) 
[[email protected] test]$ rsync -av --dry-run sdir/ --compare-dest=/home/jesse/test/tdir/mon/ /home/jesse/test/tdir/tue/ /home/jesse/test/tdir/wed/ /home/jesse/test/tdir/thu/ --backup-dir=/home/jesse/test/tdir/thu/ 
sending incremental file list 
./ 
file3 
file4 
file5 
file6 

sent 294 bytes received 31 bytes 650.00 bytes/sec 
total size is 0 speedup is 0.00 (DRY RUN) 
[[email protected] test]$ rsync -av sdir/ --compare-dest=/home/jesse/test/tdir/mon/ /home/jesse/test/tdir/tue/ /home/jesse/test/tdir/wed/ /home/jesse/test/tdir/thu/ --backup-dir=/home/jesse/test/tdir/thu/ 
sending incremental file list 
./ 
file3 
file4 
file5 
file6 

sent 438 bytes received 95 bytes 1,066.00 bytes/sec 
total size is 0 speedup is 0.00 
[[email protected] test]$ tree 
. 
├── sdir 
│ ├── file1 
│ ├── file2 
│ ├── file3 
│ ├── file4 
│ ├── file5 
│ └── file6 
└── tdir 
    ├── fri 
    ├── mon 
    │ ├── file1 
    │ └── file2 
    ├── thu 
    │ ├── file3 
    │ ├── file4 
    │ ├── file5 
    │ └── file6 
    ├── tue 
    │ └── file3 
    └── wed 
     ├── file3 
     ├── file4 
     └── file5 

7 directories, 16 files 
[[email protected] test]$ 
+0

你确定'--backup-dir'是你想要的方式吗?我是'--link-dest'中的一个更大的信任者,这样每个备份都可以完全使用,并且具有与先前备份相同的文件。这就是说,通过'--itemize-changes'('-i')选项探索你所看到的。可能会帮助您查看可能导致比较失败的原因,如果这实际上是问题所在。 – ghoti

+0

为什么要问--backup-dir是否要走?是不是很糟糕......当使用--dry-run和没有--dry-run时,我看到备份开关的结果不一致。使用--dry-run,它会给我正确的文件进行更新,但如果没有--dry-run,它会复制自原始备份以来发生更改的所有内容。 – Jess

+0

当我运行'rsync source mon'命令时rsync工作的罚款。它同样适用于'rsync源星期一',但是当我运行'rsync源--compare-dest =星期一星期三'时,这种情况会中断并给我自从星期一起改变的一切,并进入星期三。使用'--backup-dir'似乎给了我'--dry-run'正确的结果,但是当我没有它运行它时,它会做同样的事情。 – Jess

回答

1

我注意到,rsync手册页明确指出“开始在2.6.4版本中,多--link-dest目录可以提供”,并有一个类似的说明为--compare-dest但不是--backup-dir(这是有道理的)。如果你想限制你的备份“只有不在其他目录之一中的东西”,--*-dest选项是要走的路。

这里是我的测试和结果:

$ mkdir src mon tue wed 
$ for n in {1..3}; do date > src/file$n; sleep 1; done 
$ rsync -avi src/ mon/ 
building file list ... done 
.d..t.... ./ 
>f+++++++ file1 
>f+++++++ file2 
>f+++++++ file3 

sent 346 bytes received 92 bytes 876.00 bytes/sec 
total size is 87 speedup is 0.20 
$ for n in {4..5}; do date > src/file$n; sleep 1; done 
$ rsync -avi --compare-dest=$PWD/mon/ src/ tue/ 
building file list ... done 
.d..t.... ./ 
>f+++++++ file4 
>f+++++++ file5 

sent 295 bytes received 70 bytes 730.00 bytes/sec 
total size is 145 speedup is 0.40 
$ for n in {6..7}; do date > src/file$n; sleep 1; done 
$ rsync -avi --compare-dest=$PWD/mon/ --compare-dest=$PWD/tue/ src/ wed/ 
building file list ... done 
.d..t.... ./ 
>f+++++++ file6 
>f+++++++ file7 

sent 319 bytes received 70 bytes 778.00 bytes/sec 
total size is 203 speedup is 0.52 
$ 

这里的显着区别是,比较目录的每个需要自己选择。记号是不是:

rsync --compare-dest one/ two/ src/ dest/ 

而是:

rsync --compare-dest=one/ --compare-dest=two/ src/ dest/ 

为了把这个成被每天运行的代码,你可以尝试类似如下(未经测试脚本):

#!/usr/bin/env bash 

# Store our rsync arguments in an array, for easier handling. 
rsync_args=(-a) 

# If we're running interactively, show us rsync verbose output. 
if [ -t 0 ]; then 
    rsync_args+=(-vi) 
fi 

# Step through weekdays, adding days to our argument list, stopping at "today" 
read today < <(date '+%a') 
for day in Mon Tue Wed Thu Fri; do 
    [ "$day" = "$today" ] && break 
    rsync_args+=(--compare-dest=$PWD/${day,,}) 
done 

# And finally, copy everything. 
rsync "${rsync_args[@]}" src/ "${day,,}"/ 

请注意,参数扩展(${s,,}${s^^})中的bash案例控件是bash版本4的特性。

+0

谢谢。这正是我想要做的。你是一位天才先生。还有一个问题。我注意到没有改变的目录被复制到没有文件的目标,这是有道理的,但有没有办法阻止在目的地创建目录名称。 – Jess

+0

很高兴能帮到你!如果此答案似乎为您解决问题,请随时通过单击答案左侧的复选标记将问题标记为已关闭。 :-)至于跳过空目录,我从rsync的手册页看到有一个'--prune-empty-dirs'选项,你可以尝试一下。 – ghoti

+0

谢谢你的回复。我确实看到了这个选项,但我希望rsync跳过的目录是最新的目录,没有任何可更新的目录。换句话说,如果只有一个文件在一个目录中改变,我想避免创建整个层次结构。我只希望包含该文件的目录在目标上创建。这是一个新的问题,我应该发布在stackoverflow? – Jess