首頁 >系統教程 >Linux >兩個cp指令的高效用法!

兩個cp指令的高效用法!

WBOY
WBOY轉載
2024-01-02 12:53:591079瀏覽
導讀 在Linux 上能使用滑鼠點來點去的圖形化介面是一件很美妙的事…但是如果你喜歡的開發互動環境和編譯器是終端機視窗、Bash 和Vim,那你應該像我一樣經常和終端打交道。

即使是不常使用終端的人,如果對終端環境深入了解也能獲益良多。舉個例子- cp 指令,根據 維基百科 的解釋,cp (意即 copy)指令是第一個版本的 Unix 系統的一部分。連同一組其它的命令 ls、mv、cd、pwd、mkdir、vi、sh、sed 和 awk ,還有提到的 cp 都是我在 1984 年接觸 System V Unix 系統時所學習的命令之一。 cp 指令最常見的用法是製作檔案副本。像這樣:

cp sourcefile destfile

在終端機中執行此指令,上述指令將名為 sourcefile 的檔案複製到名為 destfile 的檔案中。如果在執行命令之前 destfile 文件不存在,那將會建立此文件,如果已經存在,那就會覆蓋此文件。

這個指令我不知道自己用了多少次了(我也不想知道),但是我知道在我寫測試程式碼的時候,我常用,為了保留目前正常的版本,而且又能繼續修改,我會輸入這個指令:

cp test1.py test1.bak

在過去的30多年裡,我使用了無數次這個指令。另外,當我決定要寫我的第二個版本的測試程式時,我會輸入這個指令:

cp test1.py test2.py

這樣就完成了修改程式的第一步。

我通常很少查看cp 命令的參考文檔,但是當我在備份我的圖片文件夾的時候(在GUI 環境下使用“file” 應用),我開始思考“在cp 命令中是否有個參數支援只複製新文件或是修改過的文件。」果然,真的有!

高效用法 1:更新你的資料夾

比如說在我的電腦上有一個存放各種文件的文件夾,另外我要不時的往裡面添加一些新文件,而且我會不時地修改一些文件,例如我手機裡下載的照片或者是音樂。

假設我收集的這些文件對我而言都很有價值,我有時會想做個拷貝,就像是「快照」一樣將文件保存在其它媒體。當然目前有很多程式都支援備份,但是我想更為精確的將目錄結構複製到可移動設備中,方便於我經常使用這些離線設備或連接到其它電腦上。

cp 指令提供了一個易如反掌的方法。範例如下:

在我的 Pictures 資料夾下,我有這樣一個資料夾名字為 Misc。為了方便說明,我把文件拷貝到 USB 儲存裝置上。讓我們開始吧!

me@desktop:~/Pictures$ cp -r Misc /media/clh/4388-D5FE
me@desktop:~/Pictures$

上面的命令是我從按照終端機視窗中完整複製下來的。對有些人來說不是很適應這種環境,在我們輸入指令或執行指令之前,需要注意的是me@mydesktop:~/Pictures 這個前綴,me 這個是目前用戶,mydesktop 這是電腦名稱,~/Pictures這是目前工作目錄,是/home/me/Pictures 完整路徑的縮寫。

我輸入這個指令cp -r Misc /media/clh/4388-D5FE 並執行後,拷貝Misc 目錄下所有檔案(這個-r 參數,全名為“recursive”,遞歸處理,意思是本目錄下所有文件及子目錄一起處理)到我的USB 設備的掛載目錄/media/clh/4388-D5FE。

執行指令後回到先前的提示,大多數指令繼承了Unix 的特性,在指令執行後,如果沒有任何異常什麼都不顯示,在任務結束之前不會顯示像「execution succeeded」 這樣的提示消息。如果想要獲得更多的回饋,就使用 -v 參數讓執行結果更詳細。
下圖中是我的 USB 裝置中剛拷貝過來的資料夾 Misc ,裡面總共有 9 張圖片。
两个高效的cp 命令用法!

Image of the new copy of Misc on the USB drive

假設我要在原始拷貝路徑下 ~/Pictures/Misc 下添加一些新文件,就像這樣:
两个高效的cp 命令用法!

New files added to the master directory

現在我想只拷貝新的檔案到我的儲存裝置上,我就使用 cp 的「更新」和「詳細」選項。

me@desktop:~/Pictures$ cp -r -u -v Misc /media/clh/4388-D5FE
'Misc/asunder.png' -> '/media/clh/4388-D5FE/Misc/asunder.png'
'Misc/editing tags guayadeque.png' -> '/media/clh/4388-D5FE/Misc/editing tags guayadeque.png'
'Misc/misc on usb.png' -> '/media/clh/4388-D5FE/Misc/misc on usb.png'
me@desktop:~/Pictures$

上面的第一行中是 cp 命令和具體的參數(-r 是“遞歸”, -u 是“更新”,-v 是“詳細”)。接下來的三行顯示被複製檔案的訊息,最後一行顯示命令列提示符號。

通常來說,參數 -r 也可用更詳細的風格 --recursive。但以簡短的方式,也可以這麼連用 -ruv。

高效用法 2:版本備份

回到一開始的例子中,我在開發的時候定期給我的程式碼版本進行備份。然後我找到了另一個更好用的 cp 參數。

假设我正在编写一个非常有用的 Python 程序,作为一个喜欢不断修改代码的开发者,我会在一开始编写一个程序简单版本,然后不停的往里面添加各种功能直到它能成功的运行起来。比方说我的第一个版本就是用 Python 程序打印出 “hello world”。这只有一行代码的程序就像这样:

print 'hello world'

然后我将这个代码保存成文件命名为 test1.py。我可以这么运行它:

me@desktop:~/Test$ python test1.py
hello world
me@desktop:~/Test$

现在程序可以运行了,我想在添加新的内容之前进行备份。我决定使用带编号的备份选项,如下:

clh@vancouver:~/Test$ cp --force --backup=numbered test1.py test1.py
clh@vancouver:~/Test$ ls
test1.py  test1.py.~1~
clh@vancouver:~/Test$

所以,上面的做法是什么意思呢?

第一,这个 --backup=numbered 参数意思为“我要做个备份,而且是带编号的连续备份”。所以一个备份就是 1 号,第二个就是 2 号,等等。

第二,如果源文件和目标文件名字是一样的。通常我们使用 cp 命令去拷贝成自己,会得到这样的报错信息:

cp: 'test1.py' and 'test1.py' are the same file

在特殊情况下,如果我们想备份的源文件和目标文件名字相同,我们使用 --force 参数。

第三,我使用 ls (意即 “list”)命令来显示现在目录下的文件,名字为 test1.py 的是原始文件,名字为 test1.py.~1~ 的是备份文件

假如现在我要加上第二个功能,在程序里加上另一行代码,可以打印 “Kilroy was here.”。现在程序文件 test1.py 的内容如下:

print 'hello world'
print 'Kilroy was here'

看到 Python 编程多么简单了吗?不管怎样,如果我再次执行备份的步骤,结果如下:

clh@vancouver:~/Test$ cp --force --backup=numbered 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 tutorial”,你会获得很多有趣和有用的资源。

第三,你是不是在想,“为什么我要用这么麻烦的方法,图形化界面中有相同的功能,只用点击几下岂不是更简单?”,关于这个问题我有两个理由。首先,在我们工作中需要中断其他工作流程以及大量使用点击动作时,点击动作可就不简单了。其次,如果我们要完成流水线般的重复性工作,通过使用 shell 脚本和 shell 函数以及 shell 重命名等功能就能很轻松的实现。

以上是兩個cp指令的高效用法!的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:linuxprobe.com。如有侵權,請聯絡admin@php.cn刪除