您的位置:首页 > 运维架构 > Linux

Linux命令:cp 命令--创建文件和目录的副本 mv命令--移动或重命名文件/目录

2014-09-15 10:24 597 查看
拷贝文件和目录是每一个操作系统的基本指令。备份行为基本上是创建文件和目录的副本。在Linux系统下,我们可以用cp命令来实现。


  copy 命令是什么

  正如我们在上文提到的,cp是一个用来创建文件和目录副本的命令。在这里我们提供了一些在日常操作中可能用到的cp命令的实例。


  1. 不带任何参数下,运行cp

  这是 cp 命令最基础的使用。 拷贝名为 myfile.txt 从一个位置到另一个位置,我们可以像这样子输入:
$ cp myfile.txt /home/pungki/office




  如果我们没有输入绝对路径,这意味着我们正在当前目录下拷贝一个文件。在上面的实例中,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





  3. 拷贝一个目录

  要拷贝一个目录的话会有点棘手。你需要添加 -r 或者 -R 选项来实现。-r或-R 选项表明递归操作。无论该目录是否为空目录,这个选项都是必要的。如下示例:
$ cp -r directory_1 /home/pungki/office




  需要注意的一件事,你需要移除在目录名尾部的斜杠。否则你会收到类似的错误信息cp: omitting directory‘directory_1/’



  如果你收到错误信息,则目录不会被拷贝到目标文件夹。


  4. 创建文件的硬链接,而不是拷贝它们

  拷贝文件意味着你必须使用一些存储空间来储存拷贝的文件。有时候出于某种原因,你可能想要创建“快捷方式”或者链接到文件,而不是拷贝它们。要做到这一点,我们可以使用-l选项。
$ cp -l file_4.txt /home/pungki/office




  从上图看出,我们看到file_4.txt的硬链接已经拷贝到/home/pungki/office/file_4.txt。标记有同样的 inode, 835386。但是请注意,硬链接不能用来创建目录。下面让我们看一个例子。

  原目录 directory_1 的 inode 值是 278230



  原文件 file_5.txt 的 inode 值是 279231



  对 directory_1 执行 cp 命令



  拷贝的 directory_1副本的 inode 值是 274800



  拷贝的 file_5.txt副本的 inode 值是 279231。跟它的原文件一样




  5. 创建文件的符号链接

  也有一种链接叫做 软链接 或 符号链接。我们用 -s 选项来实现。下面是命令的示例。
$ cp -s /home/pungki/Documents/file_6.txt file_6.txt


  创建符号链接只能在当前目录下进行。在上面的截图中,我们想要创建符号链接 /home/pungki/office/file6.txt 指向原文件 /home/pungki/Documents/file6.txt。但是为了创建符号链接,我必须在将/home/pungki/office作为目标目录。一旦我设法进入目录,我就可以向上面一样运行 cp -s 命令。

  现在你列出文件详情,你会看到/home/pungki/office/file_6.txt指向了原文件。在其文件名后标记了箭头符号。




  6. 不随符号链接拷贝原文件

  [译注:意思是只拷贝符号链接文件]

  我们可以用 -P 选项来实现。当对符号链接使用 cp 命令,它会照原样拷贝它自身。来看看下面的示例。
$ cp -P file_6.txt ./movie




  如你所见,cp 命令照原样拷贝file_6.txt自身。文件类型仍然是一个符号链接。


  7. 随符号链接拷贝原文件

  现在我们可以试一下-L选项。基本上,这个刚好与上面的 -P 选项 相反。下面是个示例:
$ cp -L file_6.txt ./movie




  使用这个选项,拷贝的文件将会和file_6.txt原文件一样。我们可以从文件大小看出来。拷贝的文件有50 字节而当file_6.txt作为符号链接时文件大小只有33 字节。


  8. 文件归档

  当我们去拷贝一个目录时,我们会用-r或者-R选项。但是我们也可以用-a选项来归档文件。这样会创建文件和目录的准确套录,如果有的话也可以包括符号链接。下面是示例:[译注:-a 会保留原文件或目录的属性]
$ cp -a directory_1/ /home/pungki/office




  上列的命令会拷贝一个名为 directory1 的目录到/home/pungki/office目录下。如你所见,**file6.txt**依然作为符号链接被复制。


  9. 显示正在做什么

  默认情况下,当拷贝作业成功时,我们仅仅会再次看到命令提示符。如果你想了解在拷贝文件时都发生了什么,我们可以用 -v 选项。
$ cp -v *.txt /home/pungki/office




  当我们从当前目录下拷贝所有的 txt 文件到 /home/pungki/office 目录,-v选项会显示正在操作的过程。这些额外的信息会帮助我们了解更多拷贝过程。


  10. 当原文件较目标文件新时拷贝

  我们用 -u选项来实现。下面是具体示例:
$ cp -vu *.txt /home/pungki/office




  起初我们看到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/





  12. 创建备份文件

  当目标目录已经含有同名文件,默认情况下 cp 命令会覆盖目标目录下的同名文件。使用 --backup 选项,cp 命令会为每一个现有的目标文件做一个备份。../office 相对于 /home/pungki/office 。下面是示例:
$ cp --backup=simple -v *.txt ../office




  正如我们看到的,--backup=simple 选项会创建一个在文件名末尾用波浪符标记(~)的备份文件。--backup 选项也有一些其他控制:

none, off:从不备份(即使给出 --backup)
numbered, t:用编号备份
existing, nil :如果编号备份存在则使用编号备份,否者用简易备份[译注:也就是用波浪号]
simple, never :总是使用简易备份


  13. 只拷贝文件属性

  cp 命令也提供给我们 --attributes-only 选项。顾名思义,这个选项只会拷贝文件名及其属性,不会拷贝任何数据。下面是示例:
$ cp --attributes-only file_6.txt -v ../office




  从上图看出, 原文件 file_6.txt 有 50 字节大小。用了 --attributes-only选项,拷贝的文件只有0字节大小。这是因为文件内容并没有拷贝。


  14. 强制拷贝

  用了 -f 选项会强制进行拷贝操作。如果目标文件不能打开,可以用 -f 尝试一下。
$ cp -f *.txt -v ../office





  15. 在拷贝之前先删除目标

  我们可以用,--remove-destination 选项 实现。这个选项与上面的-f选项形成对照。如果 cp 命令在目标目录下发现同名文件, cp 命令会先删除目标文件,然后再拷贝一份新的。下面是示例:
$ cp --remove-destination *.txt -v ../office





  总结

  cp 命令是 Linux 下最基础的命令之一。对于那些想要学习 Linux 的人,必须得把这个命令掌握。当然你也可以在你的终端下键入 man cp 或者 cp --help 来显示更多帮助信息。

当你想要将文件从一个位置移动到另一个地方并且不想复制它,那么mv 命令是完成这个任务的首选。


  初识 mv 命令

  mv 命令是一个与cp类似的命令,但是它并非创建文件或目录的复制品/副本。不管你在使用什么版本的Linux系统,mv 都默认安装在你的Linux系统上了。来看一下 mv 命令在日常操作中的一些例子。


  1.移动文件

  移动文件时需要注意的是文件的源地址和目标地址必须不同。这里有个例子,想要将file_1.txt文件从当前目录移动到其它目录,以/home/pungki/为例,语法应该如下:
$ mv file_1.txt /home/pungki/office




  如我们所见,当我们移动 filetxt 文件时,先前目录的 file1.txt 就被删除了。


  2.移动多个文件

  如果想一次移动多个文件,我们可以将他们放在一行并用空格分开。
$ mv file_2.txt file_3.txt file_4.txt /home/pungki/office




  如果你的文件有规律可循的话那么你就可以使用通配符。比如,为了移除所有以.txt为扩展名的文件,我们可以用下面的命令:
$ mv *.txt /home/pungki/office





  3.移动目录

  不同于复制命令,用 mv 命令移动目录相当直接。移动目录你可以使用不带选项的 mv 命令。看下面的截图就一目了然了。




  4.重命名文件或目录

  我们也用 mv 命令来重命名文件或目录。不过目标位置和源位置必须相同才可以。然后文件名必须不同。

  假定我们当前所在目录为/home/pungki/Documents,而我们想将file1.txt重命名为file2.txt。那么命令应该如下:
$ mv file_1.txt file_2.txt


  如果是绝对路径,它应该像下面这样:
$ mv /home/pungki/Documents/file_1.txt /home/pungki/Documents/file_2.txt





  5. 重命名目录

  上一段的规则同样适用于目录。请看这个例子:
$ mv directory_1/ directory_2/





  6. 打印移动信息

  当你移动或重命名一大堆文件或目录时,你可能会想在不去目标位置去查看的情况下知道你自己的命令是否成功地执行了。这就要用到-v选项了。
$ mv -v *.txt /home/pungki/office




  该方法同样适用于目录。




  7. 使用交互模式

  当你将文件移动到其它位置,而那个位置恰好有同样的文件,这时 mv 命令会覆盖掉原来的文件。对于mv的这一行为一般不会有什么提示。如果想产生一个关于覆盖文件的提示,我们可以使用-i选项。(译注:通常发行版会通过alias命令,将-i作为默认选项,所以会有提示。)

  假设我们想将 file1.txt 移动到 /home/pungki/office。同时,/home/pungki/office 目录下已经有file1.txt文件了。
$ mv -i file_1.txt /home/pungki/office




  这个提示会让我们知道目标位置处file_1.txt的存在。如果我们按y键,那么那个文件将会被删除,否则不会。


  8. 使用更新选项

  -i 选项会提示我们关于覆盖文件的提示,而 -u 则只在源文件比目标文件新时才执行更新。让我们看一看下面的例子:



  假如 file1.txt 和 file2.txt有如下特点:
File_1.txt has 84 bytes file size and it last modified time is 12:00
	
		File_2.txt has 0 bytes file size and it last modified time is 11:59


  我们想将它们移动到 /home/pungki/office 目录下。**但是目标地址*已经有file1.txt和file2.txt了。

  我们用下面的命令将file1.txt 和file2.txt从当前目录移动到/home/pungki/office
$ mv -uv *.txt /home/pungki/office


  可以看到这些文件被移动了。能移动这些文件是因为它们最近的修改时间戳比 /home/pungki/office 目录中的文件新。


  9.不要覆盖任何已存在的文件

  如果-i选项询问我们是否要覆盖文件,那么 -n 选项将不会允许我们覆盖任何已存在的文件。

  继续使用第8点中的例子,如果我们将-u 换成 -n同时加上-v选项,那么我们会看到没有任何文件移动到了 /home/pungki/office 目录下。
$ mv -vn *.txt /home/pungki/office





  10. 复制时创建备份

  默认情况下,移动文件将会覆盖已存在的目标文件。但是如果我们移动错了文件而目标文件已经被新的文件覆盖了,这时应该怎么办才好呢?有没有一种方法可以恢复之前的文件呢?答案是肯定的。我们可以用-b选项。该选项会在新文件覆盖旧文件时将旧文件做备份。这里我们还以第8点为例。
$ mv -bv *.txt /home/pungki/office




  如截图中所见,在 /home/pungki/office 目录下出现了名为file1.txt~ and file2.txt~ 的文件。那个波浪符号(~)意味着这些文件是备份文件。从它们的属性中我们可以看到,这些文件比file1.txt和file2.txt要旧。


  11. 无条件覆盖已经存在的文件

  (译注:这一节是译者补充的,原文遗漏了这个重要选项)

  当你希望无论如何都覆盖已经存在的文件或目录时,你可以使用 -f 选项。如果同时指定了 -f 选项和 -i 或 -n 选项,则 -f 选项会覆盖它们——即不进行任何提示而覆盖,所以,在使用此参数时,知道你在做什么。
$ mv -f *.txt /home/pungki/office


  总结

  移动文件和目录命令是Linux系统的基本命令。通常你可以通过man mv 或者 mv --help显示mv的手册页以了解更多详细信息。

原文地址:http://www.admin10000.com/document/4041.html

http://www.admin10000.com/document/4058.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐