如何在Linux中復(fù)制文檔?
了解在 Linux 中多種復(fù)制文檔的方式以及各自的優(yōu)點。
在辦公室里復(fù)印文檔過去需要專門的員工與機器。如今,復(fù)制是電腦用戶無需多加思考的任務(wù)。在電腦里復(fù)制數(shù)據(jù)是如此微不足道的事,以致于你還沒有意識到復(fù)制就發(fā)生了,例如當(dāng)拖動文檔到外部硬盤的時候。
數(shù)字實體復(fù)制起來十分簡單已是一個不爭的事實,以致于大部分現(xiàn)代電腦用戶從未考慮過其它的復(fù)制他們工作的方式。無論如何,在 Linux 中復(fù)制文檔仍有幾種不同的方式。每種方法取決于你的目的不同而都有其獨到之處。
以下是一系列在 Linux、BSD 及 Mac 上復(fù)制文件的方式。
在 GUI 中復(fù)制
如大多數(shù)操作系統(tǒng)一樣,如果你想的話,你可以完全用 GUI 來管理文件。
拖拽放下
最淺顯的復(fù)制文件的方式可能就是你以前在電腦中復(fù)制文件的方式:拖拽并放下。在大多數(shù) Linux 桌面上,從一個本地文件夾拖拽放下到另一個本地文件夾是移動文件的默認(rèn)方式,你可以通過在拖拽文件開始后按住 Ctrl
來改變這個行為。
你的鼠標(biāo)指針可能會有一個指示,例如一個加號以顯示你在復(fù)制模式。
復(fù)制一個文件
注意如果文件是放在遠(yuǎn)程系統(tǒng)上的,不管它是一個 Web 服務(wù)器還是在你自己網(wǎng)絡(luò)里用文件共享協(xié)議訪問的另一臺電腦,默認(rèn)動作經(jīng)常是復(fù)制而不是移動文件。
右擊
如果你覺得在你的桌面拖拽文檔不夠精準(zhǔn)或者有點笨拙,或者這么做會讓你的手離開鍵盤太久,你可以經(jīng)常使用右鍵菜單來復(fù)制文件。這取決于你所用的文件管理器,但通常來說,右鍵彈出的關(guān)聯(lián)菜單會包括常見的操作。
關(guān)聯(lián)菜單的“復(fù)制”動作將你的文件路徑(即文件在系統(tǒng)的位置)保存在你的剪切板中,這樣你可以將你的文件粘貼到別處:(LCTT 譯注:此處及下面的描述不確切,這里并非復(fù)制的文件路徑的“字符串”,而是復(fù)制了代表文件實體的對象/指針)
從右鍵菜單復(fù)制文件
在這種情況下,你并沒有將文件的內(nèi)容復(fù)制到你的剪切版上。取而代之的是你復(fù)制了文件路徑。當(dāng)你粘貼時,你的文件管理器會查看剪貼板上的路徑并執(zhí)行復(fù)制命令,將相應(yīng)路徑上的文件粘貼到你準(zhǔn)備復(fù)制到的路徑。
用命令行復(fù)制
雖然 GUI 通常是相對熟悉的復(fù)制文件方式,用終端復(fù)制卻更有效率。
cp
在終端上等同于在桌面上復(fù)制和粘貼文件的最顯而易見的方式就是 cp
命令。這個命令可以復(fù)制文件和目錄,也相對直接。它使用熟悉的來源和目的(必須以這樣的順序)句法,因此復(fù)制一個名為 example.txt
的文件到你的 Documents
目錄就像這樣:
$ cp example.txt ~/Documents
就像當(dāng)你拖拽文件放在文件夾里一樣,這個動作并不會將 Documents
替換為 example.txt
。取而代之的是,cp
察覺到 Documents
是一個文件夾,就將 example.txt
的副本放進(jìn)去。
你同樣可以便捷有效地重命名你復(fù)制的文檔:
$ cp example.txt ~/Documents/example_copy.txt
重要的是,它使得你可以在與原文件相同的目錄中生成一個副本:
$ cp example.txt example.txt
cp: 'example.txt' and 'example.txt' are the same file.
$ cp example.txt example_copy.txt
要復(fù)制一個目錄,你必須使用 -r
選項(代表 --recursive
,遞歸)。以這個選項對目錄 nodes
運行 cp
命令,然后會作用到該目錄下的所有文件。沒有 -r
選項,cp
不會將目錄當(dāng)成一個可復(fù)制的對象:
$ cp notes/ notes-backup
cp: -r not specified; omitting directory 'notes/'
$ cp -r notes/ notes-backup
cat
cat
命令是最易被誤解的命令,但這只是因為它表現(xiàn)了 POSIX 系統(tǒng)的極致靈活性。在 cat
可以做到的所有事情中(包括其原意的連接文件的用途),它也能復(fù)制。例如說使用 cat
你可以僅用一個命令就從一個文件創(chuàng)建兩個副本。你用 cp
無法做到這一點。
使用 cat
復(fù)制文檔要注意的是系統(tǒng)解釋該行為的方式。當(dāng)你使用 cp
復(fù)制文件時,該文件的屬性跟著文件一起被復(fù)制,這意味著副本的權(quán)限和原件一樣。
$ ls -l -G -g
-rw-r--r--. 1 57368 Jul 25 23:57 foo.jpg
$ cp foo.jpg bar.jpg
-rw-r--r--. 1 57368 Jul 29 13:37 bar.jpg
-rw-r--r--. 1 57368 Jul 25 23:57 foo.jpg
然而用 cat
將一個文件的內(nèi)容讀取至另一個文件是讓系統(tǒng)創(chuàng)建了一個新文件。這些新文件取決于你的默認(rèn) umask 設(shè)置。要了解 umask 更多的知識,請閱讀 Alex Juarez 講述 umask 以及權(quán)限概覽的文章。
運行 unmask
獲取當(dāng)前設(shè)置:
$ umask
0002
這個設(shè)置代表在該處新創(chuàng)建的文檔被給予 664
(rw-rw-r--
)權(quán)限,因為該 unmask
設(shè)置的前幾位數(shù)字沒有遮掩任何權(quán)限(而且執(zhí)行位不是文件創(chuàng)建的默認(rèn)位),并且寫入權(quán)限被最終位所屏蔽。
當(dāng)你使用 cat
復(fù)制時,實際上你并沒有真正復(fù)制文件。你使用 cat
讀取文件內(nèi)容并將輸出重定向到了一個新文件:
$ cat foo.jpg > baz.jpg
$ ls -l -G -g
-rw-r--r--. 1 57368 Jul 29 13:37 bar.jpg
-rw-rw-r--. 1 57368 Jul 29 13:42 baz.jpg
-rw-r--r--. 1 57368 Jul 25 23:57 foo.jpg
如你所見,cat
應(yīng)用系統(tǒng)默認(rèn)的 umask 設(shè)置創(chuàng)建了一個全新的文件。
最后,當(dāng)你只是想復(fù)制一個文件時,這些手段無關(guān)緊要。但如果你想復(fù)制文件并保持默認(rèn)權(quán)限時,你可以用一個命令 cat
完成一切。
rsync
有著著名的同步源和目的文件的能力,rsync
命令是一個復(fù)制文件的多才多藝的工具。最為簡單的,rsync
可以類似于 cp
命令一樣使用。
$ rsync example.txt example_copy.txt
$ ls
example.txt example_copy.txt
這個命令真正的威力藏在其能夠不做不必要的復(fù)制的能力里。如果你使用 rsync
來將文件復(fù)制進(jìn)目錄里,且其已經(jīng)存在在該目錄里,那么 rsync
不會做復(fù)制操作。在本地這個差別不是很大,但如果你將海量數(shù)據(jù)復(fù)制到遠(yuǎn)程服務(wù)器,這個特性的意義就完全不一樣了。
甚至在本地中,真正不一樣的地方在于它可以分辨具有相同名字但擁有不同數(shù)據(jù)的文件。如果你曾發(fā)現(xiàn)你面對著同一個目錄的兩個相同副本時,rsync
可以將它們同步至一個包含每一個最新修改的目錄。這種配置在尚未發(fā)現(xiàn)版本控制威力的業(yè)界十分常見,同時也作為需要從一個可信來源復(fù)制的備份方案。
你可以通過創(chuàng)建兩個文件夾有意識地模擬這種情況,一個叫做 example
另一個叫做 example_dupe
:
$ mkdir example example_dupe
在第一個文件夾里創(chuàng)建文件:
$ echo "one" > example/foo.txt
用 rsync
同步兩個目錄。這種做法最常見的選項是 -a
(代表 “archive”,可以保證符號鏈接和其它特殊文件保留下來)和 -v
(代表 “verbose”,向你提供當(dāng)前命令的進(jìn)度反饋):
$ rsync -av example/ example_dupe/
兩個目錄現(xiàn)在包含同樣的信息:
$ cat example/foo.txt
one
$ cat example_dupe/foo.txt
one
如果你當(dāng)作源分支的文件發(fā)生改變,目的文件也會隨之跟新:
$ echo "two" >> example/foo.txt
$ rsync -av example/ example_dupe/
$ cat example_dupe/foo.txt
one
two
注意 rsync
命令是用來復(fù)制數(shù)據(jù)的,而不是充當(dāng)版本管理系統(tǒng)的。例如假設(shè)有一個目的文件比源文件多了改變,那個文件仍將被覆蓋,因為 rsync
比較文件的分歧并假設(shè)目的文件總是應(yīng)該鏡像為源文件:
$ echo "You will never see this note again" > example_dupe/foo.txt
$ rsync -av example/ example_dupe/
$ cat example_dupe/foo.txt
one
two
如果沒有改變,那么就不會有復(fù)制動作發(fā)生。
rsync
命令有許多 cp
沒有的選項,例如設(shè)置目標(biāo)權(quán)限、排除文件、刪除沒有在兩個目錄中出現(xiàn)的過時文件,以及更多。可以使用 rsync
作為 cp
的強力替代或者有效補充。
許多復(fù)制的方式
在 POSIX 系統(tǒng)中有許多能夠達(dá)成同樣目的的方式,因此開源的靈活性名副其實。我忘了哪個復(fù)制數(shù)據(jù)的有效方式嗎?在評論區(qū)分享你的復(fù)制神技。