兩個高效的cp 命令用法!
導讀 | 在 上能使用滑鼠點來點去的圖形化介面是一件很美妙的事……但是如果你喜歡的開發互動環境和編譯器是終端視窗、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 命令中是否有個引數支援只複製新檔案或者是修改過的檔案。”果然,真的有!
比如說在我的電腦上有一個存放各種檔案的資料夾,另外我要不時的往裡面新增一些新檔案,而且我會不時地修改一些檔案,例如我手機裡下載的照片或者是音樂。
假設我收集的這些檔案對我而言都很有價值,我有時候會想做個複製,就像是“快照”一樣將檔案儲存在其它媒體。當然目前有很多程式都支援備份,但是我想更為精確的將目錄結構複製到可移動裝置中,方便於我經常使用這些離線裝置或者連線到其它電腦上。
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 張圖片。
Image of the new copy of Misc on the USB drive
假設我要在原始複製路徑下 ~/Pictures/Misc 下新增一些新檔案,就像這樣:
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。
回到一開始的例子中,我在開發的時候定期給我的程式碼版本進行備份。然後我找到了另一種更好用的 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~ 包含兩行程式碼的程式。
這個很好用的功能,我考慮做個 函式讓它變得更簡單。
第一,Linux 手冊頁,它在大多數桌面和伺服器發行版都預設安裝了,它提供了更為詳細的使用方法和例子,對於 cp 命令,在終端中輸入如下命令:
man cp
對於那些想學習如何使用這些命令,但不清楚如何使用的使用者應該首先看一下這些說明,然後我建議建立一個測試目錄和檔案來嘗試使用命令和選項。
第二,興趣是最好的老師。在你最喜歡的搜尋引擎中搜尋 “linux shell tutorial”,你會獲得很多有趣和有用的資源。
第三,你是不是在想,“為什麼我要用這麼麻煩的方法,圖形化介面中有相同的功能,只用點選幾下豈不是更簡單?”,關於這個問題我有兩個理由。首先,在我們工作中需要中斷其他工作流程以及大量使用點選動作時,點選動作可就不簡單了。其次,如果我們要完成流水線般的重複性工作,透過使用 shell 和 shell 函式以及 shell 重新命名等功能就能很輕鬆的實現。
via:
作者:Chris Hermansen 譯者:bigdimple 校對:wxy
本文由 LCTT 原創編譯,Linux中國 榮譽推出
原文來自:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2987775/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 兩種 cp 命令的絕佳用法的快捷方式
- linux 的cp命令Linux
- Linux命令—–CP命令Linux
- Linux cp命令Linux
- Linux基礎命令---cpLinux
- 深究cp拷貝資料夾時`/`的用法
- Linux常用基本命令[cp]Linux
- Linux 命令列:find 的 26 個用法示例Linux命令列
- JS中的九個console命令以及用法JS
- cp 快捷命令:複製檔案到多個目錄
- 命令列中常見命令用法及explainshell.com的用法命令列AI
- 賦值運算子和+號的用法(兩個練習)賦值
- linux echo命令的-n、-e兩個引數Linux
- 如何優雅的給 cp 和 mv 命令新增一個高顏值的進度條
- grep精確匹配搜尋某個單詞的用法 (附: grep高效用法小結))
- Linux命令學習(mkdir,cp,mv,rm,ln)Linux
- iwpriv命令用法
- linux 中 date命令的用法Linux
- nslookup命令的常見用法
- linux useradd命令的基本用法Linux
- useradd 命令的常見用法
- 一個命令對文字進行高效排序排序
- Linux最常用的5個重啟命令基本用法講解!Linux
- Linux常用命令cp學習筆記Linux筆記
- 【SHELL】grep 命令用法
- Linux sed命令用法Linux
- git grep命令用法Git
- git show命令用法Git
- rocky與linux的nmcli命令用法Linux
- traceroute命令的用法例項分享
- 命令注入-命令的連線符【‘&’‘&&’‘||’‘|’】的含義及其用法
- sys_connect_by_path的兩種用法
- 在cmd/powershell中使用java/javac -cp/--class-path命令連結多個jar包JavaJAR
- linux中cp複製時處理軟連結的兩種方式Linux
- Linux運維必知必會的命令列:find 的 26 個用法示例!Linux運維命令列
- linux命令下jq的用法簡介Linux
- jq命令用法總結
- Linux命令-Sed用法教程Linux