linux命令之cp
相信接触过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选项!