如果名为 done 的文件已经存在,那么当您给出以下命令时会发生什么?
$ cp to_do done
$ mv to_do done
Run Code Online (Sandbox Code Playgroud)
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如果done或to_do是目录,则不会被替换。如果done是目录,则文件to_do将在目录中移动/复制。如果to_do是目录,您将收到错误消息-i您可以指示mv并cp在覆盖文件时发出警告的选项cp和mv是一个别名cp -i和mv -i(特别是根用户)假设我们在这里谈论的是常规文件,在以下情况下:
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)
如果您没有对 的写访问权限done,cp将首先取消链接done(只要您对当前目录具有写访问权限并且当前目录没有t设置该位,您就可以这样做)并创建一个新的一个。cp将尝试复制尽可能多的 属性to_do,就像如果done事先不存在一样。
和
mv to_do done
Run Code Online (Sandbox Code Playgroud)
to_do只是重命名。修改的只是当前目录。如果done之前存在,它将首先取消链接。