我想cp
一个目录,但我不想覆盖任何现有文件,即使它们比复制的文件旧。而且我想完全不受欢迎,因为这将是Crontab Bash脚本的一部分。有什么想法吗?
答案 0 :(得分:477)
取自man page:
-n, --no-clobber
do not overwrite an existing file (overrides a previous -i option)
示例:
cp -n myoldfile.txt mycopiedfile.txt
答案 1 :(得分:74)
答案 2 :(得分:48)
cp -n
是你想要的。请参见手册页。
答案 3 :(得分:32)
对于那些发现没有'n'选项的人(比如我在RedHat上),你可以使用cp -u
只在源文件比现有文件更新的情况下编写文件(或者没有'现有的一个)。
[edit]正如评论中所提到的,这将覆盖旧文件,因此并不是OP想要的。请使用ceving的答案。
答案 4 :(得分:27)
这适用于RedHat:
false | cp -i source destination 2>/dev/null
更新和不会覆盖是不同的。
答案 5 :(得分:7)
Alpine linux:以下答案仅适用于单个文件的情况:在高山@IBAction func loginPressed(_ sender: Any) {
guard emailField.text != "", pwField.text != "" else {return}
FIRAuth.auth()?.signIn(withEmail: emailField.text!, password: pwField.text!, completion: { (user, error) in
if let error = error {
print(error.localizedDescription)
// You forgot to save User UID to UserDefaults here...
UserDefaults.standard.set(FIRAuth.auth()!.currentUser!.uid, forKey: "uid")
UserDefaults.standard.synchronize()
}
if user != nil {
let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "TabBarViewController")
self.present(vc, animated: true, completion: nil)
}
})
}
无法正常工作(以及cp -n
)所以解决方案在我的案例中工作,我发现是:
false | cp -i ...
在上面的示例中,我们检查if [ ! -f env.js ]; then cp env.example.js env.js; fi
文件是否存在,如果不存在,我们将env.js
复制为env.example.js
。
答案 6 :(得分:0)
某些版本的cp没有-no-clobber 选项。在这种情况下:
echo n | cp -vipr src/* dst
答案 7 :(得分:-1)
这对我有用 是n | cp -i src dest