shell命令之cp

前端之家收集整理的这篇文章主要介绍了shell命令之cp前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

操作系统为 macOS 10.12.4

cp 为复制命令,实际中分为文件间的复制,目录间的复制,文件到目录的复制以及链接的复制。


文件间的复制

cp file1 file2
  • 如果 file2 不存在,就先创建 file2 ,然后把 file1 内容复制到 file2 中
  • 如果 file2 存在,把把 file1 的内容覆盖 file2 的内容

覆盖 file2 的内容,有时候并不是所希望的

  • 参数 -i 可以提示是否覆盖 file2
  • 参数 -n 让复制命令不覆盖 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种情况
    1. 如果 source_directory 不以正斜线(/) 结尾,就会 source_directory 和 它的内容一起复制到 target_directory 下,相当于把 source_directory 剪切,然后粘贴到 target_directory 目录下
    2. 如果 source_directory 以正斜线(/)结果,就只把 source_directory 下的内容复制到 target_directory 目录下,然而并不包括 source_directory 目录本身。

而在 Unbuntu 12.04 版本测试下,会略微有点不同,当 target_directory 存在的时候,无论 source_directory 是否以正斜线(/)结尾,都是把 source_directory 的目录 和 内容都复制到 target_directory 中。

那么,当 target_directory 已经存在的情况下,用 cp -r source_directory/* target_directory/只把 source_directory 的内容复制到 target_directory 中.


链接

有时候,会想在系统上维护一个文件的两个或者多个副本,可以创建链接链接是目录上指向真实文件的占位符。

链接有两种类型

  1. 符号链接,即软链接
  2. 链接

创建硬链接

链接会创建一个独立的文件,这个文件与源文件的所有信息都相同,修改链接等同于修改文件

在 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 没有任何关系。

cp -RL

-L 配合 -R 使用,可以看到,符号链接和硬链接都复制成了单独的文件

猜你在找的Bash相关文章