![使用 rsync 仅复制源路径级别的文件夹(及其所有内容)](https://linux22.com/image/216805/%E4%BD%BF%E7%94%A8%20rsync%20%E4%BB%85%E5%A4%8D%E5%88%B6%E6%BA%90%E8%B7%AF%E5%BE%84%E7%BA%A7%E5%88%AB%E7%9A%84%E6%96%87%E4%BB%B6%E5%A4%B9%EF%BC%88%E5%8F%8A%E5%85%B6%E6%89%80%E6%9C%89%E5%86%85%E5%AE%B9%EF%BC%89.png)
我有以下树,其中f
是文件,src
而d
是目录(f
可以隐藏或不隐藏):
src/f1
src/f2
...
src/d1
src/d2
src/d3
...
我想在dst
文件夹中复制相同的结构,但排除该src
文件夹中存在的所有文件(即上面树中的f1
、等,但不包括、和其他文件夹的f2
内容)。换句话说,我只想复制文件夹及其所有内容(文件、文件夹、链接、设备等)。d1
d2
d3
src
dst
我必须使用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
增加冗长