移动保留源文件的所有权,不允许写入

Ken*_*war 7 permissions cp mv

请考虑:

$ id # Me
uid=100(user1) gid=200(group1) groups=200(group1)

$ ls -l tnsnames.ora # So user1 has only read permission on below file.
-rw-rw-r-- 1 oracle dba 411024 Jul 28  2010 tnsnames.ora

$ cp tnsnames.ora tnsnames.ora_bak

$ cat tnsnames.ora_bak > tnsnames.ora # No write access
-bash: tnsnames.ora: Permission denied

$ cp -p tnsnames.ora tnsnames.ora_copy # Copy file and preserve mode, ownership, timestamps. Requires sudo to succeed completely.

$ ls -l tnsnames.ora_copy # Mode and timestamps preserved; ownership not preserved.
-rw-rw-r-- 1 user1 group1 411024 Jul 28  2010 tnsnames.ora_copy

$ mv tnsnames.ora tnsnames.ora_move

$ ls -l tnsnames.ora_move # Move preserves mode, ownership, timestamps.
-rw-rw-r-- 1 oracle dba 411024 Jul 28  2010 tnsnames.ora_move

$
Run Code Online (Sandbox Code Playgroud)

更新

$ ls -l # As pointed out by @Gilles, the source (which is also the destination here) directory has r-x mode which allows mv to work.
drwxrwxrwx  3 oracle dba  4096 Aug 11 20:38 oracle
Run Code Online (Sandbox Code Playgroud)
  1. mv命令如何移动文件并保留模式、所有权、时间戳,而我们不能对cp...做同样的事情?
  2. 此外,如果您没有对文件的写访问权限,如何使用;更改文件的位置(元数据)mv?或者我们可以用另一种方式来看待它......mv首先在哪里制作文件的副本,然后它如何获得在复制文件上设置所有者/组的权限并删除它没有写权限的源文件在..

操作系统/Bash/实用程序版本信息:

$ echo $SHELL
/bin/bash
$ bash --version
GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)
...
$ uname -a
Linux server1 2.6.18-371.8.1.el5 #1 SMP Fri Mar 28 05:53:58 EDT 2014 x86_64 x86_64 x86_64 GNU/Linux
$ cp --version
cp (GNU coreutils) 5.97
...
$ mv --version
mv (GNU coreutils) 5.97
...
Run Code Online (Sandbox Code Playgroud)

Gil*_*il' 23

mv不会复制文件并删除原始文件,除非您在不同的文件系统之间移动文件。mv移动文件。

为了移动文件,您需要有权限将其与之前所在的目录分离,并将其附加到您放置它的目录中。换句话说,您需要对源目录和目标目录具有写入(和执行)权限。您不需要对该文件具有任何特定权限,因为您没有修改或访问文件本身。(类比:即使您没有钥匙打开盒子,您也可以移动锁定的盒子。)

cp -p可以并且确实保留文件的权限,但它不能保留文件的所有权。由于您不是cp以 root 身份运行,因此它无法创建不属于您或不属于您所属组的文件。

  • 注意:第二段的第二句和第三句是关键。\*nix 的新手经常感到惊讶和困惑,因为他们可以重命名甚至删除他们没有写访问权限(甚至他们没有 *** 无*** 访问权限)的文件;他们所需要的只是对包含目录(或目录,如果适用,对于`mv`)的写入(和执行)访问权限。 (2认同)