![什么是 cp 命令复制所有文件 + 目录结构和 cp 命令在文件已存在时跳过复制文件](https://linux22.com/image/211174/%E4%BB%80%E4%B9%88%E6%98%AF%20cp%20%E5%91%BD%E4%BB%A4%E5%A4%8D%E5%88%B6%E6%89%80%E6%9C%89%E6%96%87%E4%BB%B6%20%2B%20%E7%9B%AE%E5%BD%95%E7%BB%93%E6%9E%84%E5%92%8C%20cp%20%E5%91%BD%E4%BB%A4%E5%9C%A8%E6%96%87%E4%BB%B6%E5%B7%B2%E5%AD%98%E5%9C%A8%E6%97%B6%E8%B7%B3%E8%BF%87%E5%A4%8D%E5%88%B6%E6%96%87%E4%BB%B6.png)
我需要将目录中的所有文件复制到备份硬盘上,同时保留目录结构。这样可行吗:
find . -name '*.*' -exec cp --parents \{\} /target \;
然后我想将备份硬盘复制到新计算机,但如果该文件已存在于目标位置我不想复制它,我只是想跳过它。
做这个的最好方式是什么?
答案1
不需要 afind
和cp
组合。我会用它rsync
来完成这样的任务。
要复制“所有内容”并保留权限和所有权(并跳过不需要复制的内容),请使用“试运行”等
sudo rsync -Havn sourcedir/ targetdir/
当事情看起来不错时,删除n
并进行真正的复制,
sudo rsync -Hav sourcedir/ targetdir/
斜杠结尾sourcedir/
很重要,这在 中进行了描述man rsync
。
如果没有硬链接,可以跳过H
,搜索过程会更快。
如果权限和所有权没有问题,则可以运行rsync
不带sudo
.
答案2
只需检查 cp 的手册页,但 -n 标志应该可以解决问题。
find . -name '.' -exec cp -n --parents {} /target ;
-n 不要覆盖现有文件。
但请检查您的系统并进行测试。
在 cp 上,我可能会考虑添加 -p 标志来保留修改时间和访问时间,但它将保留您可能不想保留的许多其他文件系统信息,例如权限、ACL、所有者...
我会写 '{}' 而不是只写 {} 并用 ; 关闭指令
find . -name '*.*' -exec cp -n --parents '{}' /target \;