Bash Rsync备份一个源目录并重新检查多个目录

Bash Rsync备份一个源目录并重新检查多个目录,bash,rsync,Bash,Rsync,我试图复制(rsync)的“sdir”目录到tdir目录取决于哪一天。我想要一个完整的副本到mon目录,周二只改变什么,wed只改变什么,等等,但我没有得到我需要的结果。 请参阅我运行的实际命令: [jesse@localhost test]$ tree . ├── sdir │ ├── file1 │ ├── file2 │ ├── file3 │ ├── file4 │ └── file5 └── tdir ├── fri ├── mon │

我试图复制(rsync)的“sdir”目录到tdir目录取决于哪一天。我想要一个完整的副本到mon目录,周二只改变什么,wed只改变什么,等等,但我没有得到我需要的结果。 请参阅我运行的实际命令:

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

7 directories, 11 files
[jesse@localhost test]$ touch sdir/file6
[jesse@localhost 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)
[jesse@localhost 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)
[jesse@localhost 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)
[jesse@localhost 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)
[jesse@localhost 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
[jesse@localhost 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
[jesse@localhost test]$ 

我注意到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
#将rsync参数存储在数组中,以便于处理。
rsync_args=(-a)
#如果我们以交互方式运行,请向我们显示rsync详细输出。
if[-t0];然后
rsync_args+=(-vi)
fi
#逐步完成工作日,将天添加到我们的参数列表中,停在“今天”

今天阅读<你确定<代码>--备份目录
是你想要的方式吗?我更相信
--link dest
,这样每个备份都是完全可用的,具有与上一个备份相同的硬链接文件。也就是说,使用
--itemize changes
-i
)选项探索您所看到的内容。可能会帮助您了解导致比较失败的原因,如果这确实是问题所在的话。为什么您会问--backup dir是否是解决方法?这不好吗?我确实看到了在使用--干运行和不使用--干运行时,备份开关的结果不一致。使用--dry run,它会给我正确的文件进行更新,但如果不使用--dry run,它会复制自原始备份以来更改的所有内容。当我运行
rsync source mon
命令时,rsync工作将失效。它也适用于
rsync-source-mon-tue
,但在运行
rsync-source-compare dest=mon-tue-wed
时不起作用,这会中断并提供从周一到周三发生的所有更改。使用
--backup dir
似乎可以为我提供正确的
--dry run
结果,但是当我在没有它的情况下运行它时,它也会做同样的事情。谢谢。这正是我想做的。先生,你是个天才。还有一个问题。我注意到,未更改的目录被复制到目标,而没有任何文件,这是有道理的,但有没有办法防止在目标创建目录名。很高兴我能提供帮助!如果此答案似乎为您解决了问题,请单击答案左侧的复选标记,将问题标记为已结束。:-)至于跳过空目录,我从rsync的手册页上看到有一个
--prune empty dirs
选项,您可以尝试一下。谢谢您的回复。我确实看到了这个选项,但我希望rsync跳过的目录是最新的,没有任何需要更新的目录。换句话说,我希望避免在一个目录中只更改一个文件时创建整个层次结构。我只希望在目标上创建包含文件的目录。这是我应该在stackoverflow上发布的一个新问题吗?嗯。那么您希望
--compare dest
跳过未更改的目录,而不是在目标上创建目录层次结构?我不确定这是否可能,因为我认为,
——compare dest
只对文件起作用,但我也不确定我是否100%理解这一点,这使我认为这是正确的,这可能意味着一个新问题。这类东西也可能是的候选。是的,我只希望包含更新文件的目录备份到目标。如果我在源上有:dir1/d1file1和dir2/d2file1…现在我修改/更新dir1/d1file1上的内容…现在我rsync,我只想在目标上有dir1/d1file1…但我得到的是dir1/d1file1和dir2(但它应该是空的,这是我想要阻止的,这个目录不应该在目标上)。我将发布新问题。
#!/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,,}"/