![我们如何让 rsync 包含顶层文件?](https://linux22.com/image/1517710/%E6%88%91%E4%BB%AC%E5%A6%82%E4%BD%95%E8%AE%A9%20rsync%20%E5%8C%85%E5%90%AB%E9%A1%B6%E5%B1%82%E6%96%87%E4%BB%B6%EF%BC%9F.png)
我想要包含所有顶层文件(file1.txt
、file2
)以及 下的所有文件/top/dir1/
。我该如何实现?
我尝试了以下方法,但没有效果
$ tree
.
└── from
├── file1.txt
├── file2
└── top
├── dir1
│ └── file3.txt
└── dir2
└── file4.txt
一次尝试,缺少顶层文件
$ rsync --dry-run \
> --include='top/' \
> --include='top/dir1/' \
> --include='top/dir1/***' \
> --exclude='top/*' \
> --exclude="*" \
> -av from/* .
building file list ... done
top/
top/dir1/
top/dir1/file3.txt
其他尝试包括顶级文件,但它没有排除 dir2
$ rsync --dry-run \
> --include="*" \
> --include='top/' \
> --include='top/dir1/' \
> --include='top/dir1/***' \
> --exclude='top/*' \
> --exclude="*" \
> -av from/* .
building file list ... done
file1.txt
file2
top/
top/dir1/
top/dir1/file3.txt
top/dir2/
top/dir2/file4.txt
答案1
如果您不介意使用其他命令进行过滤,您可以使用几个 GNUfind
命令:
(cd from; find . -mindepth 1 -type f -print0; find ./top/dir1 -print0;) |
rsync -av --from0 --files-from=- from/ to
--files-from=FILE read list of source-file names from FILE
-0, --from0 all *from/filter files are delimited by 0s
rsync
可以接受从另一个文件(或标准输入)同步的文件列表-
,但路径必须是相对的(或者我们必须使用--no-R
以允许绝对路径)。因此,首先cd
进入源目录,然后find
使用适当的选项运行:
-mindepth 1
仅限于指定目录,而不递归到子目录-type f
仅列出常规文件-print0
使用 ASCII NUL 字符分隔输出(\0
)
答案2
您可以使用以下命令包含顶层的所有内容,并且仅包含顶层下的 dir1。
rsync --dry-run \
--include='top/dir1/***' \
--exclude='top/*' \
-av from/ .