rsync排除和包含问题;将文件包含在排除目录中

rsync排除和包含问题;将文件包含在排除目录中

我想用 执行以下操作rsync

目录结构示例

  • 家/netadmin/docker-数据
  • 家/netadmin/docker-data/uptime-kuma/
  • 家/netadmin/docker-data/uptime-kuma/error.log

我想要rsyncdocker-data目录,但想要排除该home/netadmin/docker-data/uptime-kuma/目录,但想要包含home/netadmin/docker-data/uptime-kuma/error.log.

我正在使用以下命令:

rsync -av --delete --include-from='/home/netadmin/include.txt' --exclude-from='/home/netadmin/exclude.txt' /home/netadmin/docker-data /home/netadmin/temp/

目录被排除,但文件未被复制。

我的问题是,这可能吗?

这就是我的包含和排除文件的样子:

排除.txt

uptime-kuma/

包含.txt

+ error.log

答案1

“窍门”是不是排除uptime-kuma目录,但排除其内容。

使用包含模式error.log和排除模式,您可以在排除该子目录中的其他所有内容之前uptime-kuma/*包含该文件。uptime-kuma/error.log

使用uptime-kuma/而不是uptime-kuma/*,您将排除该目录,并且rsync永远不会查看它的内部。

rsync -av --delete \
    --include=error.log \
    --exclude='uptime-kume/*' \
    ~netadmin/docker-data ~netadmin/temp/

我希望这是一个等效的测试:

$ tree
.
`-- topdir
    |-- file-1
    |-- file-2
    |-- file-3
    |-- file-4
    |-- file-5
    `-- subdir
        |-- file-a
        |-- file-b
        |-- file-c
        |-- file-d
        |-- file-e
        `-- myfile

2 directories, 11 files
$ rsync -av --include=myfile --exclude='subdir/*' topdir/ copydir
sending incremental file list
created directory copydir
./
file-1
file-2
file-3
file-4
file-5
subdir/
subdir/myfile

sent 436 bytes  received 171 bytes  1,214.00 bytes/sec
total size is 0  speedup is 0.00
$ tree copydir
copydir
|-- file-1
|-- file-2
|-- file-3
|-- file-4
|-- file-5
`-- subdir
    `-- myfile

1 directory, 6 files

提示:rsync如果您使用 ,您将了解为什么包含或排除某些内容背后的原因-vv

这是使用“错误”的排除模式:

$ rm -r copydir
$ rsync -avv --include=myfile --exclude='subdir/' topdir/ copydir
sending incremental file list
[sender] hiding directory subdir because of pattern subdir/
created directory copydir
delta-transmission disabled for local transfer or --whole-file
./
file-1
file-2
file-3
file-4
file-5
total: matches=0  hash_hits=0  false_alarms=0 data=0

sent 326 bytes  received 211 bytes  1,074.00 bytes/sec
total size is 0  speedup is 0.00

这是使用“正确的”排除模式:

$ rm -r copydir
$ rsync -avv --include=myfile --exclude='subdir/*' topdir/ copydir
sending incremental file list
[sender] hiding file subdir/file-a because of pattern subdir/*
[sender] hiding file subdir/file-b because of pattern subdir/*
[sender] hiding file subdir/file-c because of pattern subdir/*
[sender] hiding file subdir/file-d because of pattern subdir/*
[sender] hiding file subdir/file-e because of pattern subdir/*
[sender] showing file subdir/myfile because of pattern myfile
created directory copydir
delta-transmission disabled for local transfer or --whole-file
./
file-1
file-2
file-3
file-4
file-5
[generator] risking file subdir/myfile because of pattern myfile
subdir/
subdir/myfile
total: matches=0  hash_hits=0  false_alarms=0 data=0

sent 436 bytes  received 307 bytes  1,486.00 bytes/sec
total size is 0  speedup is 0.00

答案2

我找到了另一种方法。我用

cp --parents

选项仅复制我想要的排除目录中的特定文件,并保留目录结构。

相关内容