我想cp一个目录,但我不想覆盖任何现有的文件,即使它们比复制的文件更老。我希望它完全非交互式,因为这将是Crontab Bash脚本的一部分。什么好主意吗?
cp
cp -n
是你想要的。请参阅手册页。
摘自手册页:
-n, --no-clobber do not overwrite an existing file (overrides a previous -i option)
例子:
cp -n myoldfile.txt mycopiedfile.txt
对于那些发现没有'n'选项的人(就像我在RedHat上),你可以使用cp -u只在源比现有的源更新(或者没有现有的源)时写入文件。
cp -u
[edit]正如评论中提到的,这将覆盖旧的文件,所以这不是OP想要的。使用ceving的答案。
这将在RedHat工作:
false | cp -i source destination 2>/dev/null
更新和没有覆盖是不同的。
考虑使用rsync。
rsync
rsync -a -v --ignore-existing src dst
根据评论,rsync -a -v src dst是不正确的,因为它将更新现有的文件。
rsync -a -v src dst
下面的答案只适用于单一文件的情况:在阿尔卑斯山cp -n不工作(和false | cp -i ...太),所以解决方案在我的情况下,我发现是:
false | cp -i ...
if [ ! -f env.js ]; then cp env.example.js env.js; fi
在上面的例子中,如果env.js文件不存在,则将env.example.js复制到env.js。
env.js
env.example.js
某些版本的cp没有——no-clobber选项。在这种情况下:
echo n | cp -vipr src/* dst
这对我有用 是n | cp -i SRC dest