Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Rsync:排除目录内容,但包括目录_Linux_Bash_Rsync - Fatal编程技术网

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

Linux Rsync:排除目录内容,但包括目录,linux,bash,rsync,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/* 注意:我确实搜索了这个问题。我发现了很多类似的帖子,但不完全是这个。如果已经有人被骗了,我会道歉 尝试: --include=src/dir/to/s

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

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

这将省略目录
dir/to/skip

但是,我想复制目录本身,但不复制目录内容|是否有一行rsync来完成这一任务

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

注意:我确实搜索了这个问题。我发现了很多类似的帖子,但不完全是这个。如果已经有人被骗了,我会道歉

尝试:

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

尝试:

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

--exclude
选项采用
模式,这意味着您应该能够执行以下操作:

rsync -avz --exclude='dir/to/skip/*' /my/source/path /my/backup/path
请注意,引用
模式
是为了防止shell在其上进行全局扩展

由于
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
需要注意的是,上述
模式中的前导
/
表示源目录的根,而不是文件系统根。这在
rsync
手册页中进行了解释。如果省略前导斜杠,
rsync
将尝试从每个路径的末尾匹配
模式。这可能导致意外排除文件。例如,假设我有一个目录
a/3/2/
,其中包含一组我确实想要传输的文件。如果我省略了前导的
/
,并执行以下操作:

rsync -r --exclude='2/*' a/ b/
然后
模式
将同时匹配
a/2/*
a/3/2/*
,这不是我想要的。

排除--exclude
选项采用
模式
,这意味着您应该能够做到:

rsync -avz --exclude='dir/to/skip/*' /my/source/path /my/backup/path
请注意,引用
模式
是为了防止shell在其上进行全局扩展

由于
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
需要注意的是,上述
模式中的前导
/
表示源目录的根,而不是文件系统根。这在
rsync
手册页中进行了解释。如果省略前导斜杠,
rsync
将尝试从每个路径的末尾匹配
模式。这可能导致意外排除文件。例如,假设我有一个目录
a/3/2/
,其中包含一组我确实想要传输的文件。如果我省略了前导的
/
,并执行以下操作:

rsync -r --exclude='2/*' a/ b/
然后,
模式
将同时匹配
a/2/*
a/3/2/*
,这不是我想要的。

是的,
--filter
选项也提供了大量细粒度控件。是的,
--filter
选项也提供了大量细粒度控件。