cp -a foo/* bar/
会将 foo 的内容复制到 bar 中,替换任何已存在的文件。我可以使用 -n 标志来cp
不覆盖现有文件或-i
使其以交互方式询问是否覆盖文件。
问题
cp
如果文件已经存在,有没有办法使失败并返回错误代码?- 如果没有,是否可以使用
rsync
其他常用工具?
答案1
Linux
如果文件存在于 Linux 上,则通过 GNU 的轻微修改可能会失败nohup
。nohup
重定向/dev/null
到stdin
,因此任何交互式提示都会被忽略,但将使用stdin
视为失败。
$ nohup cp -ia foo/* bar/
清理一下:
$ nohup cp -ia foo/* bar/ 2>nohup.out && rm nohup.out || cat nohup.out
- 默认情况下
nohup
重定向stdout
到nohup.out
和stderr
。stdout
2>nohup.out
也放入stderr
文件中。- 将
&& rm || cat
在成功时清除或nohup.out
在错误时输出错误。您可以添加任何您想要的错误处理,而不是/包括或删除所有这些并正常cat
处理。$?
- 如果您认真使用它,您将需要对临时文件位置更加了解 (
mktemp -d
)
BSD
在 BSD 上,您可以重定向stdin
到cp
将被视为n
并返回非 0 状态的位置。
$ cp -ia foo/* bar/ </dev/null
操作系统X
令人惊讶的是, OSX 上的行为与 BSD 不同,并且确实会在跳过的文件上cp
返回非 0 状态。-n
$ cp -n foo/* bar/