Linux how to copy but not overwrite?
我想要一个目录,但是我不想覆盖任何现有的文件,即使它们比复制的文件旧。我想做的完全没有吸引力,因为这将是crontab bash脚本的一部分。有什么想法吗?
- unix.stackexchange.com/questions/67539/…
摘自手册页:
1 2
| -n, --no-clobber
do not overwrite an existing file (overrides a previous -i option) |
例子:
1
| cp -n myoldfile.txt mycopiedfile.txt |
- 改为使用rsync -a -v --ignore-existing 。
- @Whitebird的解决方案也很到位。
- 注意,如果文件存在,将退出并显示错误。要成功退出,请尝试cp -n source.txt destination.txt || true。
- 如果我运行cp-n,它就不工作了。/*
- @whitebird:当我运行rsync-a-v--ignore existing/*.jpgl/时,它会覆盖已经存在的同名文件
- @如果Ubuntu 12.04上存在该文件,galendrew cp -n不会错误退出。
- @Whitebird rsync -a -v --ignore-existing 比cp -n 有什么优势?
- @盖伦德雷夫证实。谢谢您。我的项目不是在Xcode中在向我的目标添加运行脚本之后构建的。
- rsync速度很慢,但unix.stackexchange.com/questions/91382/…
- 这是递归工作的吗?比如说,用-Rn吗?
考虑使用rsync。
1
| rsync -a -v --ignore-existing src dst |
根据注释,rsync -a -v src dst不正确,因为它将更新现有文件。
- 要添加--ignore-existing标志以防止覆盖现有文件。
- 完全命令rsync -a -v --ignore-existing 确实是正确的答案,而不是上面的cp -u。
- 使用cp有什么问题?
- 如果以前的复制被中断,只复制了一个被截断的文件,我相信cp-u不会重新复制它…但是rsync会忽略现有的吗?可能也不是…所以它们完全等价,对吗?
- rsync保留文件时间戳,而cp使用当前时间(在我的经验中)
- 您可以使用--preserve=timestamps和cp来保留时间戳。
- 有些服务器没有rsync
是你想要的。参见手册页。
对于那些发现没有"n"选项的人(比如我在Redhat上),您可以使用cp -u只在源文件比现有文件更新(或者没有现有文件)时写入文件。
[编辑]正如评论中提到的,这将覆盖旧的文件,因此这不是OP想要的。用塞文的答案。
- OP要求即使现有文件比复制的文件旧,也不要覆盖它们,因此-u实际上不符合目的。
- 天哪,你说得对。我很惊讶人们花了这么长时间才注意到。
这将适用于RedHat:
1
| false | cp -i source destination 2>/dev/null |
更新和不覆盖是不同的。
- false在这里做什么?
- @Frozenflame回答了-i个问题。
- 这也适用于BusyBox CP。
- 显然,如果您尝试复制的文件超过arg_max,这个命令将不起作用。要解决此问题,请检查此链接。
AlpineLinux:下面的答案只适用于单一文件的情况:在Alpinecp -n中,它不工作(而且false | cp -i ...也不工作),所以在我的案例中,我发现的解决方案是:
1
| if [ ! -f env.js ]; then cp env.example.js env.js; fi |
在上面的例子中,我们检查env.js文件是否存在,如果不存在,我们将env.example.js复制为env.js。