TranslateProject/published/201403/15 Linux cp Command Examples - Create a Copy of Files and Directories.md
2014-04-01 17:09:17 +08:00

238 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Linux cp 命令的15个示例 - 创建文件和目录的副本
================================================================================
拷贝文件和目录是每一个操作系统的基本指令。备份行为基本上是创建文件和目录的副本。在Linux系统下我们可以用**cp**命令来实现。
### copy 命令是什么 ###
正如我们在上文提到的,**cp**是一个用来创建文件和目录副本的命令。在这里我们提供了一些在日常操作中可能用到的cp命令的实例。
### 1. 不带任何参数下运行cp ###
这是 cp 命令最基础的使用。 拷贝名为 myfile.txt 从一个位置到另一个位置,我们可以像这样子输入:
$ cp myfile.txt /home/pungki/office
![Copy without options](http://linoxide.com/wp-content/uploads/2014/01/cp_default.png)
如果我们没有输入绝对路径,这意味着我们正在当前目录下拷贝一个文件。在上面的实例中,**myfile.txt**位于**/home/pungki/Documents**目录下。如果我们当前目录正是**/home/pungki/Documets**,那么没有必要输入**/home/pungki/Documents/myfile.txt**来拷贝文件。当**/home/pungki/office**是一个目录,则文件会拷贝到里面。
#### 2. 同时拷贝多个文件 ####
要在同时拷贝多个文件,我们只需要将多个文件用空格隔开。如下示例:
$ cp file_1.txt file_2.txt file_3.txt /home/pungki/office
![Copying multiple files](http://linoxide.com/wp-content/uploads/2014/01/cp_multiple_file.png)
#### 3. 拷贝一个目录 ####
要拷贝一个目录的话会有点棘手。你需要添加 **-r** 或者 **-R** 选项来实现。**-r**或**-R** 选项表明递归操作。无论该目录是否为空目录,**这个选项都是必要的**。如下示例:
$ cp -r directory_1 /home/pungki/office
![Copy directory](http://linoxide.com/wp-content/uploads/2014/01/cp_directory.png)
需要注意的一件事,你需要**移除在目录名尾部的斜杠**。否则你会收到类似的错误信息**cp: omitting directorydirectory_1/**
![Copy directory error](http://linoxide.com/wp-content/uploads/2014/01/cp_directory_error.png)
如果你收到错误信息,则目录不会被拷贝到目标文件夹。
#### 4. 创建文件的硬链接,而不是拷贝它们####
拷贝文件意味着你必须使用一些存储空间来储存拷贝的文件。有时候出于某种原因,你可能想要创建“快捷方式”或者链接到文件,而不是拷贝它们。要做到这一点,我们可以使用**-l**选项。
$ cp -l file_4.txt /home/pungki/office
![Copy hardlinks](http://linoxide.com/wp-content/uploads/2014/01/cp_hardlinks.png)
从上图看出,我们看到**file_4.txt**的硬链接已经拷贝到**/home/pungki/office/file_4.txt**。标记有同样的 inode, **835386**。但是请注意,硬链接不能用来创建目录。下面让我们看一个例子。
*原目录 directory_1 的 inode 值是 278230*
![Inode number of original directory](http://linoxide.com/wp-content/uploads/2014/01/cp_hardlinks_dir_1_ori.png)
*原文件 file_5.txt 的 inode 值是 279231*
![Original inode number of file](http://linoxide.com/wp-content/uploads/2014/01/cp_hardlinks_file_5_ori.png)
*对 directory_1 执行 cp 命令*
![Copy using -rl options](http://linoxide.com/wp-content/uploads/2014/01/cp_hardlinks_rl_dir.png)
*拷贝的 directory_1副本的 inode 值是 274800*
![Inode number of copied directory](http://linoxide.com/wp-content/uploads/2014/01/cp_hardlinks_dir_1_result.png)
*拷贝的 file_5.txt副本的 inode 值是 279231。跟它的原文件一样*
![Inode number of copied file](http://linoxide.com/wp-content/uploads/2014/01/cp_hardlinks_file_5_result.png)
#### 5. 创建文件的符号链接 ####
也有一种链接叫做 **软链接****符号链接**。我们用 **-s** 选项来实现。下面是命令的示例。
$ cp -s /home/pungki/Documents/file_6.txt file_6.txt
创建符号链接只能在当前目录下进行。在上面的截图中,我们想要创建符号链接 **/home/pungki/office/file_6.txt 指向原文件 /home/pungki/Documents/file_6.txt**。但是为了创建符号链接,**我必须**在将/home/pungki/office作为目标目录。一旦我设法进入目录我就可以向上面一样运行 cp **-s** 命令。
现在你列出文件详情,你会看到**/home/pungki/office/file_6.txt**指向了原文件。在其文件名后标记了箭头符号。
![Symbolic links](http://linoxide.com/wp-content/uploads/2014/01/cp_symlinks.png)
#### 6. 不随符号链接拷贝原文件 ####
[译注:意思是只拷贝符号链接文件]
我们可以用 **-P** 选项来实现。当对符号链接使用 cp 命令,它会照原样拷贝它自身。来看看下面的示例。
$ cp -P file_6.txt ./movie
![Copy using -P option](http://linoxide.com/wp-content/uploads/2014/01/cp_P.png)
如你所见cp 命令照原样拷贝**file_6.txt**自身。文件类型仍然是一个符号链接。
#### 7. 随符号链接拷贝原文件 ####
现在我们可以试一下**-L**选项。基本上,这个刚好与上面的 -P 选项 **相反**。下面是个示例:
$ cp -L file_6.txt ./movie
![Copy using -L option](http://linoxide.com/wp-content/uploads/2014/01/cp_L.png)
使用这个选项,拷贝的文件将会和**file_6.txt**原文件一样。我们可以从文件大小看出来。拷贝的文件有**50 字节**而当**file_6.txt**作为符号链接时文件大小只有**33 字节**。
#### 8. 文件归档 ####
当我们去拷贝一个目录时,我们会用**-r**或者**-R**选项。但是我们也可以用**-a**选项来归档文件。这样会创建文件和目录的**准确套录**,如果有的话也可以包括符号链接。下面是示例:[译注:-a 会保留原文件或目录的属性]
$ cp -a directory_1/ /home/pungki/office
![Copy using -a option](http://linoxide.com/wp-content/uploads/2014/01/cp_a.png)
上列的命令会拷贝一个名为 directory_1 的目录到**/home/pungki/office**目录下。如你所见,**file_6.txt**依然作为符号链接被复制。
#### 9. 显示正在做什么 ####
默认情况下,当拷贝作业成功时,我们仅仅会再次看到命令提示符。如果你想了解在拷贝文件时都发生了什么,我们可以用 **-v** 选项。
$ cp -v *.txt /home/pungki/office
![Verbose option](http://linoxide.com/wp-content/uploads/2014/01/cp_v.png)
当我们从当前目录下拷贝所有的 txt 文件到 **/home/pungki/office** 目录,**-v**选项会显示正在操作的过程。这些额外的信息会帮助我们了解更多拷贝过程。
#### 10. 当原文件较目标文件新时拷贝 ####
我们用 **-u**选项来实现。下面是具体示例:
$ cp -vu *.txt /home/pungki/office
![Copy only if newer](http://linoxide.com/wp-content/uploads/2014/01/cp_u.png)
起初我们看到**file_1.txt 是0字节**大小。然后我们用 vi 编辑,加入一些内容并保存。接下来,我们发现文件大小已经变为了 36 个字节。
与此同时在**/home/pungki/office**目录中,我们**已经包含了所有**txt文件。当我们用 -u 选项,结合 -v 选项来查看具体操作cp 命令会只拷贝比目标目录下新的文件。因此,我们看到**只有 file_1.txt 拷贝到 /home/pungki/office 目录下**。
#### 11. 使用交互模式 ####
交互模式下会询问是否覆盖目标目录下的文件。使用 **-i** 选项,启用交互模式。
$ cp -ir directory_1/ /home/pungki/office/
![Interactive mode](http://linoxide.com/wp-content/uploads/2014/01/cp_i.png)
#### 12. 创建备份文件 ####
当目标目录已经含有同名文件,默认情况下 cp 命令会覆盖目标目录下的同名文件。使用 **--backup** 选项cp 命令会为每一个现有的目标文件做一个备份。../office 相对于 /home/pungki/office 。下面是示例:
$ cp --backup=simple -v *.txt ../office
![Backup option](http://linoxide.com/wp-content/uploads/2014/01/cp_backup.png)
正如我们看到的,**--backup=simple** 选项会创建一个在文件名末尾用波浪符标记(~)的备份文件。**--backup** 选项也有一些其他控制:
- **none, off**:从不备份(即使给出 --backup)
- **numbered, t**:用编号备份
- **existing, nil** :如果编号备份存在则使用编号备份,否者用简易备份[译注:也就是用波浪号]
- **simple, never** :总是使用简易备份
#### 13. 只拷贝文件属性 ####
cp 命令也提供给我们 **--attributes-only** 选项。顾名思义,这个选项只会拷贝文件名及其属性,不会拷贝任何数据。下面是示例:
$ cp --attributes-only file_6.txt -v ../office
![Copy attributes only](http://linoxide.com/wp-content/uploads/2014/01/cp_attributes_only.png)
从上图看出, **原文件 file_6.txt 有 50 字节**大小。用了 **--attributes-only**选项,**拷贝的文件只有0字节**大小。这是因为文件内容并没有拷贝。
### 14. 强制拷贝 #####
用了 **-f** 选项会强制进行拷贝操作。如果目标文件不能打开,可以用 **-f** 尝试一下。
$ cp -f *.txt -v ../office
![Copy with force](http://linoxide.com/wp-content/uploads/2014/01/cp_f.png)
#### 15. 在拷贝之前先删除目标 ####
我们可以用,**--remove-destination 选项** 实现。这个选项与上面的**-f选项形成对照**。如果 cp 命令在目标目录下发现同名文件, cp 命令会先删除目标文件,然后再拷贝一份新的。下面是示例:
$ cp --remove-destination *.txt -v ../office
![Remove destination option](http://linoxide.com/wp-content/uploads/2014/01/cp_remove_destination.png)
### 总结 ###
cp 命令是 Linux 下最基础的命令之一。对于那些想要学习 Linux 的人,必须得把这个命令掌握。当然你也可以在你的终端下键入 **man cp** 或者 **cp --help** 来显示更多帮助信息。
--------------------------------------------------------------------------------
via: http://linoxide.com/linux-command/linux-cp-command/
译者:[Luoxcat](https://github.com/Luoxcat) 校对:[Mr小眼儿](http://blog.csdn.net/tinyeyeser)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译,[Linux中国](http://linux.cn/) 荣誉推出