复制目录,但如果目标文件已存在则失败

复制目录,但如果目标文件已存在则失败

cp -a foo/* bar/会将 foo 的内容复制到 bar 中,替换任何已存在的文件。我可以使用 -n 标志来cp不覆盖现有文件或-i使其以交互方式询问是否覆盖文件。

问题

  • cp如果文件已经存在,有没有办法使失败并返回错误代码?
  • 如果没有,是否可以使用rsync其他常用工具?

答案1

Linux

如果文件存在于 Linux 上,则通过 GNU 的轻微修改可能会失败nohupnohup重定向/dev/nullstdin,因此任何交互式提示都会被忽略,但将使用stdin视为失败。

$ nohup cp -ia foo/* bar/

清理一下:

$ nohup cp -ia foo/* bar/ 2>nohup.out && rm nohup.out || cat nohup.out
  • 默认情况下nohup重定向stdoutnohup.outstderrstdout
  • 2>nohup.out也放入stderr文件中。
  • && rm || cat在成功时清除或nohup.out在错误时输出错误。您可以添加任何您想要的错误处理,而不是/包括或删除所有这些并正常cat处理。$?
  • 如果您认真使用它,您将需要对临时文件位置更加了解 ( mktemp -d)

BSD

在 BSD 上,您可以重定向stdincp将被视为n并返回非 0 状态的位置。

$ cp -ia foo/* bar/ </dev/null

操作系统X

令人惊讶的是, OSX 上的行为与 BSD 不同,并且确实会在跳过的文件上cp返回非 0 状态。-n

$ cp -n foo/* bar/

相关内容