Rsync:排除目录内容,但包括目录

时间:2019-04-17 20:34:04

标签: linux bash rsync

我知道可以像这样用--exclude排除目录:

rsync -avz --exclude=dir/to/skip /my/source/path /my/backup/path

这将省略目录dir/to/skip

但是我想复制目录本身而不是目录 |是否有使用rsync的单线实现此目的?

基本上,包含 dir/to/skip,但排除 dir/to/skip/*

  

注意:我确实搜索了这个问题。我发现了很多类似的帖子,但并非完全如此。抱歉,如果已经有欺骗。

2 个答案:

答案 0 :(得分:1)

尝试:

rsync -avz --include=src/dir/to/skip --exclude=src/dir/to/skip/* src_dir dest_dir

--include=src/dir/to/skip包含目录。 --exclude=src/dir/to/skip/*排除目录下的所有内容。

答案 1 :(得分:1)

--exclude选项带有一个PATTERN,这意味着您应该能够执行以下操作:

rsync -avz --exclude='dir/to/skip/*' /my/source/path /my/backup/path

请注意,引号PATTERN是为了防止外壳程序对其进行glob扩展。

由于dir/to/skip与模式dir/to/skip/*不匹配,因此将其包括在内。

下面是显示其工作原理的示例:

> mkdir -p a/{1,2,3}
> find a -type d -exec touch {}/file \;
> tree --charset ascii a
a
|-- 1
|   `-- file
|-- 2
|   `-- file
|-- 3
|   `-- file
`-- file

3 directories, 4 files


> rsync -r --exclude='/2/*' a/ b/
> tree --charset ascii b
b
|-- 1
|   `-- file
|-- 2
|-- 3
|   `-- file
`-- file

3 directories, 3 files

请注意,/上方的前导PATTERN代表源目录的根,而不是文件系统根。 rsync手册页对此进行了说明。如果您省略了斜杠,rsync将尝试从每个路径的 end 中匹配PATTERN。这可能会导致意外排除文件。例如,假设我有一个目录a/3/2/,其中包含一堆我要做要传输的文件。如果我省略开头的/并这样做:

rsync -r --exclude='2/*' a/ b/

然后PATTERN将同时匹配a/2/*a/3/2/*,这不是我想要的。