![如何替换rsync传输中的空格(和特殊字符)?](https://linux22.com/image/222754/%E5%A6%82%E4%BD%95%E6%9B%BF%E6%8D%A2rsync%E4%BC%A0%E8%BE%93%E4%B8%AD%E7%9A%84%E7%A9%BA%E6%A0%BC%EF%BC%88%E5%92%8C%E7%89%B9%E6%AE%8A%E5%AD%97%E7%AC%A6%EF%BC%89%EF%BC%9F.png)
我使用 rsync 将某些文件复制到一个文件夹(故意省略目录),该文件夹通过 Syncthing 同步到其他设备:
find /mnt/media/ -name "*.epub" > /home/user/.logs/rsync/epub-paths.txt && \
rsync --archive --files-from=/home/user/.logs/rsync/epub-paths.txt \
--no-relative / /home/user/Documents/ebooks/
这些文件都不是我创建的,文件名通常包含空格和字符,这在 shell 中是有问题的。可悲的是我无法轻松重命名已安装源驱动器上的所有内容。
我计划使用排毒递归处理目标电子书目录,但程序不会替换现有文件 - 在这种情况下,这些文件都是相同的。不幸的是,即使我删除了所有重复项,每次运行脚本时(目前每天),rsync 仍然会徒劳地传输千兆字节的数据。使用杜佩斯或类似的随后删除重复文件的方法并不是实际的解决方案。
简而言之:不要修改任何本地数据,在写入目标之前重写 rsync 传输中的文件名(和文件夹,如果有的话)。
答案1
您也许可以使用以 NULL 结尾的参数:
find /mnt/media/ -name '*.epub' -print0 |
rsync -as --files-from=- --from0 --no-relative / /home/user/Documents/ebooks
或者,如果您使用find
的是 POSIX 并且没有该-print0
选项,请尝试这个稍微不太全面的解决方案:
find /mnt/media/ -name '*.epub' |
rsync -as --files-from=- --no-relative / /home/user/Documents/ebooks