linux下的cp命令详解,linux中的cp命令
芦苇
Linux上可以用鼠标点击的图形界面是一个很棒的东西.但是,如果你最喜欢的开发交互环境和编译器是终端窗口、Bash、Vim,你经常和我这样的终端打交道。
即使不经常使用终端的人也能从对终端环境的深入了解中受益。3354cp命令就是一个例子。根据维基百科,cp (copy)命令是第一个Unix系统版本的一部分。和其他命令ls、mv、cd、pwd、mkdir、vi、sh、sed、awk一起提到的Cp是我在1984年接触System V Unix系统时学到的命令之一。cp命令最常见的用途是创建文件的副本。是这样的:
CP源文件destfile
当这个命令在终端上运行时,上面的命令会将名为sourcefile的文件复制到名为destfile的文件中。如果在执行命令之前destfile文件不存在,将创建它,如果它已经存在,将被覆盖。
我不知道我使用这个命令多少次了(我也不想知道),但是当我在写测试代码的时候,我知道我经常使用它。键入以下命令以保持当前的正常版本并继续修改:
cp test1.py test1.bak
在过去的30年里,我多次使用这个命令。另外,当我决定编写第二个测试程序版本时,请输入以下命令:
cp test1.py test2.py
至此,修改程序的第一步已经完成。
通常情况下,你很少会看到cp命令的参考文档,但是在备份镜像文件夹时(在GUI环境下使用“文件”APP),cp命令可能包含只支持复制新文件或更改文件的参数。果然有!
高效1:更新文件夹
例如,我的电脑有存放各种文件的文件夹。此外,有时会在那里添加新文件。然后,时不时修改下载到我手机里的照片、音乐等文件。
假设我收集的这些文件对我来说是有价值的,我有时会想制作副本,像“快照”一样保存在其他介质上。当然,很多程序都支持备份,但是我们想更准确地将目录结构复制到可移动设备上。这对于频繁使用这些离线设备和连接其他计算机非常有用。
cp命令提供了一种简单的方法。例子如下。
在我的图片文件夹下,有一个文件夹名为Misc为了方便解释,把文件复制到USB存储设备上。我们走吧!
me @ desktop:~/pictures $ CP-r misc/media/clh/4388-d5fe
me@desktop:~~/pictures$
上面的命令完全是从终端窗口复制过来的。对于一些人来说,他们不习惯这样的环境。在我们输入或执行命令之前,前缀me@mydesktop:~/Pictures,前缀me是当前用户,mydesktop是计算机的名称,~/Pictures
我输入并执行这个命令cp -r Misc /media/clh/4388-D5FE,然后我会把Misc目录下的所有文件(this -r参数,全称“recursive”,递归处理,这里
当运行命令并返回到上一个提示符时,大多数命令都继承了Unix的特征。运行命令后,如果没有任何异常,则不会显示任何内容,在任务结束前会显示类似“执行成功”的提示。如果您想要更多的反馈,请使用-v参数来更详细地了解运行结果。
下图是刚刚复制到我的USB设备上的文件夹Misc。里面有9张图片。
imageofthenewcopyofmiscontheusbdrive
假设您在原始复制路径~/Pictures/Misc下添加了一个新文件,如下所示:
new filesaddedtothemasterdirectory
使用cp的“更新”和“高级”选项,因为您只想将新文件复制到存储设备。
me @ desktop://pictures $ CP-r-u-v misc/media/clh/4388-d5fe
misc/asunder . png -/media/clh/4388-d5fe/misc/asunder . png
misc/editingtagsguayadeque . png -/media/clh/4388-d5fe/misc/editingtagsguayadeque . png
misc/misc USB . png -/media/clh/4388-d5fe/misc/misc ONU
sb.png
我@桌面:~/图片$
上面的第一行是cp命令和特定的参数(-r是“递归”,-u是“更新”,-v是“详细”)。接下来的三行显示复制文件的信息,最后一行显示命令行提示符。
一般来说,参数-r还可以用在更详细的样式中——递归。但简而言之,也可以这么用——ruv。
高效使用2:版本备份
回到最初的例子,我在开发期间定期备份我的代码版本。然后我找到了另一个更好的cp参数。
假设我正在编写一个非常有用的Python程序。作为一个喜欢不断修改代码的开发人员,我会在最开始写一个简单版本的程序,然后不断给它添加各种功能,直到运行成功。比如我的第一个版本是用Python程序打印出“hello world”。只有一行代码的程序如下所示:
打印“hello world”
然后我将这段代码保存为一个名为test1.py的文件,我可以像这样运行它:
me @ desktop:~/Test $ python test1 . py
你好世界
me@desktop:~/Test$
现在程序可以运行了,我想在添加新内容之前做个备份。我决定使用编号备份选项,如下所示:
clh @ Vancouver:~/Test $ CP-force-backup=编号test1.py test1.py
clh@vancouver:~/Test$ ls
test1.py test1.py.~1~
clh@vancouver:~/Test$
那么,上面的做法是什么意思呢?
第一,这个- backup=numbered参数的意思是“我要做一个备份,而且是带数字的串行备份”。所以一个备份是1号,第二个是2号,以此类推。
第二,如果源文件和目标文件同名。通常,我们使用cp命令来复制我们自己,并且我们得到这个错误消息:
CP:“test1.py”和“test1 . py”是同一个文件
在特殊情况下,如果我们要备份的源文件和目标文件同名,我们使用- force参数。
第三,我使用ls(意思是“列表”)命令显示当前目录中的文件。名称test1.py是原始文件,名称test1.py.~1~是备份文件。
现在,如果我想添加第二个函数,并在程序中添加另一行代码,我可以打印“Kilroy在这里。”。现在程序文件test1.py的内容如下:
打印“hello world”
打印“基尔罗伊在这里”
看到Python编程有多简单了吧?无论如何,如果我再次执行备份步骤,结果如下:
clh @ Vancouver:~/Test $ CP-force-backup=编号test1.py test1.py
clh@vancouver:~/Test$ ls
test1 . py test1 . py . ~ 1 ~ test1 . py . ~ 2 ~
clh@vancouver:~/Test$
现在我有两个备份文件:test1.py.~1~一个一行代码的程序,test1.py.~2~一个两行代码的程序。
这是一个易于使用的功能。我在考虑做一个shell函数让它更简单。
最终总结
首先,在大多数桌面和服务器发行版中默认安装的Linux手册页提供了更详细的使用方法和示例。对于cp命令,在终端中输入以下命令:
man cp
对于那些想学习如何使用这些命令,但不知道如何使用它们的用户,他们应该先看看这些说明,然后我建议创建一个测试目录和文件来尝试使用这些命令和选项。
第二,兴趣是最好的老师。在自己喜欢的搜索引擎中搜索“linux shell教程”,会得到很多有趣有用的资源。
第三,你是否在想,“为什么我要用这么麻烦的方法?图形界面中也有相同的功能。只要点几下不是更简单吗?”关于这个问题,我有两个理由。首先,当我们需要中断其他工作流,大量使用点击动作时,点击动作并不简单。其次,如果要完成流水线之类的重复性工作,利用shell脚本和shell函数、shell重命名等功能就可以轻松实现。