关于 cp -a 命令备份文件的疑惑

08/10/2011

鸟哥的私房菜中关于 cp 命令由如下疑问:

[root@www ~]# cd /tmp
[root@www tmp]# cp /var/log/wtmp . <==想要复制到目前的目录,最后的 . 不要忘
[root@www tmp]# ls -l /var/log/wtmp wtmp
-rw-rw-r-- 1 root utmp 96384 Sep 24 11:54 /var/log/wtmp
-rw-r--r-- 1 root root 96384 Sep 24 14:06 wtmp
# 注意上面的特殊字体,在不加任何选项的情况下,文件的某些属性/权限会改变;
# 这是个很重要的特性!要注意喔!还有,连文件创建的时间也不一样了!
# 那如果你想要将文件的所有特性都一起复制过来该怎办?可以加上 -a 喔!如下所示:
[root@www tmp]# cp -a /var/log/wtmp wtmp_2
[root@www tmp]# ls -l /var/log/wtmp wtmp_2
-rw-rw-r-- 1 root utmp 96384 Sep 24 11:54 /var/log/wtmp
-rw-rw-r-- 1 root utmp 96384 Sep 24 11:54 wtmp_2
# 了了吧!整个数据特性完全一模一样ㄟ!真是不赖~这就是 -a 的特性!

但是实际上在 ubuntu 上得到的结果却不太一样:

royakon@UBUNTU-LLQ-0-212:~/temp$ cp /var/log/wtmp .
royakon@UBUNTU-LLQ-0-212:~/temp$ ls -l /var/log/wtmp wtmp
-rw-rw-r-- 1 root    utmp    135168 2011-08-10 14:25 /var/log/wtmp
-rw-r--r-- 1 royakon royakon 135168 2011-08-10 14:54 wtmp
#到这里表现完全一样
royakon@UBUNTU-LLQ-0-212:~/temp$ cp -a /var/log/wtmp wtmp-a
royakon@UBUNTU-LLQ-0-212:~/temp$ ls -l /var/log/wtmp wt*
-rw-rw-r-- 1 root    utmp    135168 2011-08-10 14:25 /var/log/wtmp
-rw-r--r-- 1 royakon royakon 135168 2011-08-10 14:54 wtmp
-rw-rw-r-- 1 royakon royakon 135168 2011-08-10 14:25 wtmp-a
#当使用了 -a  选项后,实际表现和鸟哥例题中有些差别,备份文档的所有者和群组并没有能够备份过来,有了改变.

注意到鸟哥利用 root 身份进行的举例,做如下测试:

royakon@UBUNTU-LLQ-0-212:~/temp$ sudo cp -a /var/log/wtmp wtmp-b
royakon@UBUNTU-LLQ-0-212:~/temp$ ls -l /var/log/wtmp wtmp-b
-rw-rw-r-- 1 root    utmp    135936 2011-08-10 16:01 /var/log/wtmp
-rw-rw-r-- 1 root    utmp    135936 2011-08-10 16:01 wtmp-b

是不是表示当使用 cp -a 时只有文件所有者才能进行完全属性的备份呢?

由於vbird的身份并不能随意修改文件的拥有者与群组,因此虽然能够复制wtmp的相关权限与时间等属性, 但是与拥有者、群组相关的,原本vbird身份无法进行的动作,即使加上 -a 选项,也是无法达成完整复制权限的!

看到了鸟哥的解释了!唉原来再这一章的最后才说明这一点。

cp -a 保留文件属性时受用户权限限制。
例如:要保留文件的所有者属性,你得有更改文件所有者的权限才行。要保留文件
的组属性,你必须得是文件所有者组的成员。

总而言之,cp -a 只能在用户权限所允许的范围内尽可能多地保留文件原始属性。
权限越大,属性保留越完整。