我们如何让 rsync 包含顶层文件?

我们如何让 rsync 包含顶层文件?

我想要包含所有顶层文件(file1.txtfile2)以及 下的所有文件/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

man rsync

    --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/ .

相关内容