最近,我经常rsync
将一个包含大量文件和子目录的大目录复制到外部硬盘上。有些文件的文件名太长,rsync
无法复制。截断有问题的文件名后,现在我想复制生成的新文件。
源目录中有一些文件被我删除,但我不希望目标目录中的任何内容被我删除rsync
。我希望它们保持完整,而不被镜像到源,同时复制源中的新文件,最后从源中删除源和目标之间常见的所有文件 ( --remove-from-source
)。
rsync -nrhtPsv --stats --ignore-existing --remove-source-files /run/media/username/hdd1/DIR1 /run/media/username/external_hdd
据我所知,--ignore-existing
两者--remove-source-files
不兼容。
--ignore-existing
并且--update
在空运行中不显示任何有关删除/删除任何内容的信息,但都列出了缺少文件的目录的路径。
什么命令可以做我想要的事情?
答案1
多项标准:
- 我不希望目标目录中的任何内容被删除
rsync
- 不指定--delete
- 我想要复制源处的 [...] 新文件- 照常
- 从源中删除源和目标之间共有的所有文件- 使用
--remove-source-files
您没有提到的是目标中的现有文件是否应该更新,所以我假设它们应该更新。
结果命令应如下所示,
rsync --dry-run -rt -Phv --stats --remove-source-files /run/media/username/hdd1/DIR1 /run/media/username/external_hdd
(删除--dry-run
以执行更改而不仅仅是查看它们。)
您遇到的问题--ignore-existing --remove-source-files
是--ignore-existing
作为排除规则实施的。这意味着目标上存在的文件将被忽略,但由于它们被忽略,因此它们不能成为--remove-source-files
.根据您的情况,您可以使用--backup --remove-source-files
然后在目标上恢复备份:
find /run/media/username/external_hdd -type f -name '*~' -exec sh 'for f in "$@"; do echo mv -f "${f} "${f%~}"; done' _ {} +
(删除echo
以执行重命名,而不仅仅是查看它们。)