Rsync 包含文件夹和链接但排除文件

Rsync 包含文件夹和链接但排除文件

我需要将目录结构从一个地方复制到另一个地方。我只需要复制文件夹并排除文件。

主要问题是我有链接文件夹! 在此输入图像描述

当我打字时

rsync -avz -H  /tmp/test/ /tmp/copy/

它可以正确复制文件夹和链接文件夹,也可以复制文件

当我打字时

rsync -avz -H -f"+ */" -f"- *" /tmp/test/ /tmp/copy/

它包括所有文件夹,排除文件,但也排除链接文件夹。

当我打字时

rsync -avz -H -f"+ */" -f"- *.txt" /tmp/test/ /tmp/copy/

它正确创建文件夹和链接文件夹,但仅排除 txt 文件

当我打字时

rsync -vzrptgoD -L -H -f"+ */" -f"- *" /tmp/test/ /tmp/copy/

它排除文件,但转换实际文件夹中的链接文件夹,只需连接路径。

文件类型有很多种,我不能像 -f"- *.txt" 这样添加它们

我应该怎么办?我可以在 -f"+ */" 中添加链接文件夹语法吗?

如果没有还有其他选择吗?

答案1

您不能直接在 中执行此操作rsync,因为您已经注意到它的过滤规则仅将目录与“其他所有内容”区分开来。

但是,您可以构造一个find命令来选择所需的项目(l对于符号链接,d对于目录),然后将该列表传递给rsync复制

find src/ \( -type l -o -type d \) -printf "%P\0" |
    rsync --files-from - --from0 -av src/ dst/

设想

mkdir /tmp/608951
cd /tmp/608951
mkdir -p src/{test1,test2} dst; ln -s test1 test/link

演示,将目录和符号链接从src复制到dst

find src/ \( -type l -o -type d \) -printf "%P\0" | rsync --files-from - --from0 -av src/ dst/

输出

building file list ... done
link -> test1
test1/
test2/

sent 134 bytes  received 25 bytes  318.00 bytes/sec
total size is 5  speedup is 0.03

证据,使用ls -R src dst,显示dst仅包含目录和符号链接,而src还包含文件

dst:
link  test1  test2

dst/test1:

dst/test2:

src:
link  test1  test2

src/test1:
file1

src/test2:
file2

如果您没有 GNU find,请将其更改-printf "%P\n"为 plain-print--from0rsync.缺点是您将无法复制名称包含奇怪字符(例如换行符)的文件。

相关内容