linux命令之cp

Published: 03 Jan 2014 Category: linux

相信接触过linux系统的人来说,cp命令肯定用过,也再熟悉不过了。曾经,我也以为是,后来发现我错了,看起来简单的东西其实蕴含深刻!

在一次制作根文件系统的过程中,由于错误的使用了cp命令,导致文件系统镜像做出来巨大无比,我du了一下,吓了一跳。经过排查之后发现原来罪魁祸首是cp

1.拷贝单个文件:

cp path/to/file1 path/to/file2  

2.拷贝多个文件:

cp path/to/file1 path/to/file2 path/to/file3 path/to/directory  

3.拷贝整个目录:

cp -r path/to/directory1 path/to/directory2  

注意上述path/to/directory1里面如果包含了符号连接,你拷贝的将是符号连接指向的文件,而不是符号连接本身!这就是我上述做出的文件系统超级大的原因。

下面就通过一个例子来简单地介绍使用cp过程中的一个小窍门:

4.新建一个目录:

mkdir test  

5.进入test目录,新建一个文件,简单写几个字符进去:

cd test
touch example.txt  
echo aaa >> example.txt

6.创建一个指向example.txt的符号连接:

ln -s example.txt link0  

到目前为止,test目录下的文件结构是这样子的:

-rw-r--r-- 1 root root  0 Jan  3 01:07 example.txt
lrwxrwxrwx 1 root root 11 Jan  3 01:07 link0 -> example.txt  

7.使用cp命令拷贝符号连接link0

cp link0 link1  

此时我们再来看一下test目录下的文件结构:

-rw-r--r-- 1 root root  0 Jan  3 01:07 example.txt
lrwxrwxrwx 1 root root 11 Jan  3 01:07 link0 -> example.txt
-rw-r--r-- 1 root root  0 Jan  3 01:10 link1  

细心的你会发现link1是一个普通文件,并不是一个符号连接。我们再来看一下link1的内容:

cat link1
aaa  

到了此处,你应该明白我们上述的拷贝操作其实拷贝的是example.txt,而不是符号连接本生;相反,如果我们想单单拷贝符号连接本身该怎么办呢? 方法如下:

8.使用-R选项拷贝符号连接本生:

cp -R link0 link2

此时,我们再来看一下目录结构:

-rw-r--r-- 1 root root  4 Jan  3 01:12 example.txt
lrwxrwxrwx 1 root root 11 Jan  3 01:07 link0 -> example.txt
-rw-r--r-- 1 root root  4 Jan  3 01:13 link1
lrwxrwxrwx 1 root root 11 Jan  3 01:18 link2 -> example.txt  

此时,你就什么都明白了!

接着上面,如果你想拷贝的目录里面带有符号连接,请使用-R选项而不是-r选项!