當前位置:
首頁 > 知識 > cp 命令兩個高效的用法

cp 命令兩個高效的用法

cp 命令兩個高效的用法


Linux 中高效的備份拷貝命令 -- Chris Hermansen

本文導航

  • -高效用法 1:更新你的文件夾 …… 21%

  • -高效用法 2:版本備份 …… 54%

  • -最後總結 …… 80%

編譯自: https://opensource.com/article/17/7/two-great-uses-cp-command

作者: Chris Hermansen

譯者: bigdimple

Linux 中高效的備份拷貝命令

在 Linux 上能使用滑鼠點來點去的圖形化界面是一件很美妙的事……但是如果你喜歡的開發交互環境和編譯器是終端窗口、Bash 和 Vim,那你應該像我一樣經常和終端打交道。

即使是不經常使用終端的人,如果對終端環境深入了解也能獲益良多。舉個例子—— cp 命令,據 維基百科[1] 的解釋,cp (意即 copy)命令是第一個版本的 Unix[2] 系統的一部分。連同一組其它的命令 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 命令其他更棒的使用方式嗎?請在留言中積極回復哦~

(題圖:stonemaiergames.com)



作者簡介:

Chris Hermansen - 1978 年畢業於英國哥倫比亞大學後一直從事計算機相關職業,我從 2005 年開始一直使用 Linux、Solaris、SunOS,在那之前我就是 Unix 系統管理員了,在技術方面,我的大量的職業生涯都是在做數據分析,尤其是空間數據分析,我有大量的編程經驗與數據分析經驗,熟練使用 awk、Python、PostgreSQL、PostGIS 和 Groovy。



via: https://opensource.com/article/17/7/two-great-uses-cp-command

作者:Chris Hermansen[3] 譯者:bigdimple 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出

  • [1]: 維基百科 - https://en.wikipedia.org/wiki/Cp_(Unix)

  • [2]: Unix - https://en.wikipedia.org/wiki/Unix

  • [3]: Chris Hermansen - https://opensource.com/users/clhermansen

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Linux技術 的精彩文章:

CoreOS,一款 Linux 容器發行版
LKU:一套在 Ubuntu/LinuxMint 上編譯、安裝和更新最新內核的 Shell 腳本
我選擇 dwm 作為窗口管理器的 4 大理由
深度學習(Deep Learning)發展史

TAG:Linux技術 |

您可能感興趣

兩種 cp 命令的絕佳用法的快捷方式
8 個 Linux 下 ls 命令的高級用法!個個驚艷!
8個Linux下ls 命令的高級用法!個個驚艷!
Linux find命令高級用法
如何使用 rsync 的高級用法進行大型備份
useradd 命令的常見用法
這才是精髓!4個案例掌握Windows 10命令用法
Linux中find命令用法全匯總,看完就沒有不會用的!
秘傳:一些穴位的用法和療效
1㎡的N種用法,雞肋空間重新再利用
Linux wget 命令用法詳解
VBScript的 用法
Linux useradd 命令基本用法
菜鳥們,通過這幾個例子,包你學會 uptime 命令的用法
冠詞:不定冠詞 a/an 的用法
養蘭花,沒有統一的方法,就用4個通用法
C++對象的使用:四種對象生存期和作用域、static 用法總結
這幾個excel用法在財會工作中的強大功能
常用量詞「本」「階」「回」「個」的用法與讀法
枇杷膏的功效與用法