使用 rsync 仅复制源路径级别的文件夹(及其所有内容)

使用 rsync 仅复制源路径级别的文件夹(及其所有内容)

我有以下树,其中f是文件,srcd是目录(f可以隐藏或不隐藏):

src/f1
src/f2
...
src/d1
src/d2
src/d3
...

我想在dst文件夹中复制相同的结构,但排除该src文件夹中存在的所有文件(即上面树中的f1、等,但不包括、和其他文件夹的f2内容)。换句话说,我只想复制文件夹及其所有内容(文件、文件夹、链接、设备等)。d1d2d3srcdst

我必须使用rsync并且最好只使用一个文件(但欢迎--exclude-from使用任何其他方式)。rsync

我尝试放入/*排除文件,因为/允许我锚定src*意味着“匹配除斜杠(/)之外的所有内容”,但它会导致一个空dst文件夹。

非常感谢

答案1

男人 rsync 说:

option --filter=RULE, -f add a file-filtering RULE

所以,尝试一下

rsync -avr -f"+ */" -f"- *" /src/ /dest/

-f"+ */"-f"- *"将在各处删除文件时添加目录。

正如@Kusalananda 所说,这将避免所有子树中的任何文件。

rsync -avr -f"+ */" -f"- /*" /src/ /dest/ 或者

rsync -avr --include="*/" --exclude="/*" /src/ /dest/ 将同步树子目录中的文件。

答案2

使用works排除源目录中的所有内容/*,您只需要再次包含这些目录:

sudo rsync -av --include='/*/' --exclude='/*' src/ dest
  • --exclude='/*'排除源目录中的所有文件/目录

  • --include='/*/'覆盖排除并再次包含源目录中的目录,必须写在排除之前

  • -a存档模式,快捷方式-rlptgoD

    • -r递归到目录
    • -l将符号链接复制为符号链接
    • -p保留权限
    • -t保留修改时间
    • -g保留组
    • -o保留所有者(仅限超级用户)
    • -D保留设备文件(仅限超级用户)/特殊文件
  • -v增加冗长

相关内容