我知道可以像这样用--exclude
排除目录:
rsync -avz --exclude=dir/to/skip /my/source/path /my/backup/path
这将省略目录dir/to/skip
但是我想复制目录本身而不是目录 |是否有使用rsync的单线实现此目的?
基本上,包含 dir/to/skip
,但排除 dir/to/skip/*
注意:我确实搜索了这个问题。我发现了很多类似的帖子,但并非完全如此。抱歉,如果已经有欺骗。
答案 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/*
,这不是我想要的。