我正在一个需要公钥和密码的集群上工作,我有一个复杂的文件结构来组织我在这个集群上的工作,并且我想在我的本地计算机上仅备份一些目录。
我希望 rsync 仅获取具有名为“backup”的文件的目录。例子:
data/sub1/sub1_1/backup < back up this directory
data/sub1/sub1_2/ < don't back up
由于这个密码问题,我想避免任何多次调用 ssh 的脚本,是否有任何高级过滤器能够使用 rsync 来做到这一点?
答案1
如果要备份的目录数量不是太多,您可以使用 bash shell 脚本将它们放入命令行中。以下 shellscript 是一个演示。
目录结构
$ tree data
data
└── sub1
├── sub1_1
│ ├── a
│ ├── b
│ └── backup
├── sub1_2
│ └── c
└── sub1_3
├── backup
└── d
4 directories, 6 files
Shell脚本rsyncer
#!/bin/bash
echo -n 'rsync -avn ' > command
find . -name 'backup' -type f | sed -e 's%/backup%%' -e 's%.*%"&"%' | tr '\n' ' ' >> command
echo ' target/' >> command
bash command
试运行
$ ./rsyncer
sending incremental file list
created directory target
sub1_1/
sub1_1/a
sub1_1/b
sub1_1/backup
sub1_3/
sub1_3/backup
sub1_3/d
sent 199 bytes received 64 bytes 526.00 bytes/sec
total size is 0 speedup is 0.00 (DRY RUN)
请注意 sub1/sub1_2和文件C未列出。
备份
n
从 shellscript 中的 rsync 中删除选项并运行它,或者从文件中删除选项command
并运行它,
sed 's/-avn/-av/' command > buper
$ bash buper
sending incremental file list
created directory target
sub1_1/
sub1_1/a
sub1_1/b
sub1_1/backup
sub1_3/
sub1_3/backup
sub1_3/d
sent 383 bytes received 148 bytes 1,062.00 bytes/sec
total size is 0 speedup is 0.00
$ tree target
target
├── sub1_1
│ ├── a
│ ├── b
│ └── backup
└── sub1_3
├── backup
└── d
2 directories, 5 files
请注意 sub1/sub1_2和文件C未列出。
答案2
也许你可以使用类似的东西。
- 使用该
find
命令查找您感兴趣的文件。 - 将它们插入
dirname
以打印存储文件的目录名称。 - 使用
uniq
所以目录仅列出 - 迭代 rsync 中的结果或将它们放在一起,这样 rsync 只会被调用一次。
简单的脚本:
for i in $(find . -name 'backup' -type f | xargs dirname | uniq); do
echo "here: $i"
# here goes rsync
done