![Rsync 包含文件夹和链接但排除文件](https://linux22.com/image/179934/Rsync%20%E5%8C%85%E5%90%AB%E6%96%87%E4%BB%B6%E5%A4%B9%E5%92%8C%E9%93%BE%E6%8E%A5%E4%BD%86%E6%8E%92%E9%99%A4%E6%96%87%E4%BB%B6.png)
我需要将目录结构从一个地方复制到另一个地方。我只需要复制文件夹并排除文件。
当我打字时
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
并--from0
从rsync
.缺点是您将无法复制名称包含奇怪字符(例如换行符)的文件。