Linux如何复制但不能覆盖?

时间:2012-02-22 10:09:35

标签: linux bash cp

我想cp一个目录,但我不想覆盖任何现有文件,即使它们比复制的文件旧。而且我想完全不受欢迎,因为这将是Crontab Bash脚本的一部分。有什么想法吗?

8 个答案:

答案 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)

考虑使用rsync

rsync -a -v --ignore-existing src dst

根据评论rsync -a -v src dst不正确,因为它会更新现有文件。

答案 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