cp 和 mv 如果命名的文件已经存在

use*_*626 2 cp rename files

如果名为 done 的文件已经存在,那么当您给出以下命令时会发生什么?

$ cp to_do done
$ mv to_do done
Run Code Online (Sandbox Code Playgroud)

Mat*_*teo 7

done 将被替换为内容 to_do

您可以通过一个简单的测试来检查:

$ echo a > done
$ echo b > to_do
$ cp to_do done 
$ cat done
b
Run Code Online (Sandbox Code Playgroud)

$ echo a > done
$ echo b > to_do
$ mv to_do done
$ cat done
b
Run Code Online (Sandbox Code Playgroud)

编辑

在评论之后一些额外的信息

  • done如果doneto_do是目录,则不会被替换。如果done是目录,则文件to_do目录中移动/复制。如果to_do是目录,您将收到错误消息
  • 使用-i您可以指示mvcp在覆盖文件时发出警告的选项
  • 在某些分布cpmv是一个别名cp -imv -i(特别是根用户)

  • @JamesHebden 我不认为*暗示*这个词是完全正确的......暗示。默认情况下,它们可能*别名*`-i` 选项。 (3认同)

Sté*_*las 5

假设我们在这里谈论的是常规文件,在以下情况下:

cp to_do done
Run Code Online (Sandbox Code Playgroud)

如果done不可写,您将收到一条错误消息。否则, 的内容to_do将被复制过来 done。这意味着done保持相同的 inode、权限、所有权、出生时间。的-p(或-a在一些实施)会尝试复制一些属性to_do

和:

cp -f to_do done
Run Code Online (Sandbox Code Playgroud)

如果您没有对 的写访问权限donecp将首先取消链接done(只要您对当前目录具有写访问权限并且当前目录没有t设置该位,您就可以这样做)并创建一个新的一个。cp将尝试复制尽可能多的 属性to_do,就像如果done事先不存在一样。

mv to_do done
Run Code Online (Sandbox Code Playgroud)

to_do只是重命名。修改的只是当前目录。如果done之前存在,它将首先取消链接。