我想 cp 一个目录,但我不想覆盖任何现有的文件,即使它们比复制的文件旧 . 而且我想完全不受欢迎,因为这将是Crontab Bash脚本的一部分 . 有任何想法吗?
cp
取自man page:
-n, --no-clobber do not overwrite an existing file (overrides a previous -i option)
例:
cp -n myoldfile.txt mycopiedfile.txt
考虑使用rsync .
rsync -a -v --ignore-existing src dst
根据评论 rsync -a -v src dst 不正确,因为它将更新现有文件 .
rsync -a -v src dst
cp -n
是你想要的 . 请参见手册页 .
对于那些发现没有选项的人(就像我在RedHat上一样),如果源比现有源(或者没有现有源)更新,则可以使用 cp -u 来仅写入文件 .
cp -u
[编辑]如评论中所述,这将覆盖旧文件,因此不是OP想要的 . 使用ceving的答案 .
这将适用于RedHat:
false | cp -i source destination 2>/dev/null
更新而不是覆盖是不同的 .
Alpine linux: 以下答案仅适用于单个文件的情况:在alpine 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
6 回答
取自man page:
例:
考虑使用rsync .
根据评论
rsync -a -v src dst
不正确,因为它将更新现有文件 .是你想要的 . 请参见手册页 .
对于那些发现没有选项的人(就像我在RedHat上一样),如果源比现有源(或者没有现有源)更新,则可以使用
cp -u
来仅写入文件 .[编辑]如评论中所述,这将覆盖旧文件,因此不是OP想要的 . 使用ceving的答案 .
这将适用于RedHat:
更新而不是覆盖是不同的 .
Alpine linux: 以下答案仅适用于单个文件的情况:在alpine
cp -n
无法正常工作(以及false | cp -i ...
)所以解决方案在我的情况下工作,我发现:在上面的例子中,我们检查
env.js
文件是否存在,如果不存在,我们将env.example.js
复制为env.js
.