操作系统为 macOS 10.12.4
cp 为复制命令,实际中分为文件间的复制,目录间的复制,文件到目录的复制以及链接的复制。
文件间的复制
cp file1 file2
覆盖 file2 的内容,有时候并不是所希望的
文件到目录的复制
cp source_file ... target_directory
把多个 source_file 复制到 target_directory 目录中
省略号表示多个 source_file
目录间的复制
目录间的复制需要带上 -R 参数
cp -R source_directory target_directory
这也有几种情况
- 如果 target_directory 不存在,会先创建 target_directory,然后把 source_directory 中的内容复制到 target_directory 目录下
- 如果 target_directory 存在,又有2种情况
而在 Unbuntu 12.04 版本测试下,会略微有点不同,当 target_directory 存在的时候,无论 source_directory 是否以正斜线(/)结尾,都是把 source_directory 的目录 和 内容都复制到 target_directory 中。
那么,当 target_directory 已经存在的情况下,用 cp -r source_directory/* target_directory/
只把 source_directory 的内容复制到 target_directory 中.
链接
有时候,会想在系统上维护一个文件的两个或者多个副本,可以创建链接,链接是目录上指向真实文件的占位符。
链接有两种类型
创建硬链接
硬链接会创建一个独立的文件,这个文件与源文件的所有信息都相同,修改硬链接等同于修改源文件
在 Linux 下,可以用 cp -l
或者 ln
命令创建硬链接,但是在 macOS 下,只能用 ln
命令创建硬链接
可以看到,文件 david 和 hard_link_david 从 inode,到文件权限,到文件大小,到最近修改时间都相同。
当然,如果 hard_link_david 已经存在,系统会提示文件已经存在,所以你并不必担心覆盖的问题。我觉得应该始终保持谨慎的心态,用 ln -i
让系统提示是否替代,然后做出选择。
创建符号链接
同样 ,在 Linux 下,可以用 cp -s
创建符号链接,然而在 macOS 下,只能用 ln -s
创建符号链接。
可以看到,符号链接文件 和 源文件 的 inode 信息不一样,这说明符号链接是一个独立的文件。同时也可以看到文件大小不一样,这说明符号链接文件并不存储源文件中的数据,只需要存储源文件的有关信息(源文件位置)。
上面例子中,是在当前目录下创建的符号链接,但是如果不是在当前目录下创建符号链接
ln -s source_file target_directory/symbolic_link_file
如果我们用 ls -li target_directory/symbolic_link_file
查看,确实是指向名为 source_file 的符号链接,但是其实这个名为 source_file 文件指的的 target_directory 目录下的 source_file 文件,然而 target_directory 目录下的 source_file 在此次的符号链接的创建过程过没有创建出来,但是只要你编辑过smbolic_link_file,这个目录下的 source_file 才会创建。
目前我还不知道这个行为在实际中怎么使用
同样的,如果你用 mv 命令把当前目录下的符号链接移动到另外一个目录,也会发生同样的情况。
符号链接的复制
单独复制一个符号链接文件,其实是创建一个内容与源文件相同,然而却一个独立的新文件。
copy_symbolic_link_david 虽然是 symbolic_link_david 复制过来的,但是从文件类型看是一个文件,而不是一个链接,从文件大小看,它与文件david 的大小是一样的,所以 copy_symbolic_link_david 只是一个与源文件 david 内容相同的独立文件而已。
如果把带有符号链接的目录进行复制
可以看到 dir2 目录是完全复制了 dir1 目录,只是两个符号链接指的都只是各自目录下的 david 文件,这个从 inode 信息就可以看出两个目录下的 david 文件是不一样的(只是内容相同而已)。这个系统默认行为与 cp -RP
行为是一样的。
硬链接复制
单独复制一个硬链接,效果和符号链接一样,会创建一个新的文件( 内容相同 )。
但是如果复制的硬链接所在目录呢?
从 inode 信息可以看到,dir2 目录下的复制出来的文件硬链接不仅是一个单独的文件,而且与 dir2 目录下的文件 zhou 没有任何关系。