如何在Linux中複製文檔

在辦公室裏複印文檔過去須要專門的員工與機器。現在,複製是電腦用戶無需多加思考的任務。在電腦裏複製數據是如此微不足道的事,以至於你尚未意識到複製就發生了,例如當拖動文檔到外部硬盤的時候。node

數字實體複製起來十分簡單已經是一個不爭的事實,以至於大部分現代電腦用戶從未考慮過其它的複製他們工做的方式。不管如何,在 Linux 中複製文檔仍有幾種不一樣的方式。每種方法取決於你的目的不一樣而都有其獨到之處。linux

如下是一系列在 Linux、BSD 及 Mac 上覆制文件的方式。服務器

 

在 GUI 中複製網絡

 

如大多數操做系統同樣,若是你想的話,你能夠徹底用 GUI 來管理文件。工具

拖拽放下

最淺顯的複製文件的方式可能就是你之前在電腦中複製文件的方式:拖拽並放下。在大多數 Linux 桌面上,從一個本地文件夾拖拽放下到另外一個本地文件夾是移動文件的默認方式,你能夠經過在拖拽文件開始後按住 Ctrl 來改變這個行爲。this

你的鼠標指針可能會有一個指示,例如一個加號以顯示你在複製模式。
如何在Linux中複製文檔如何在Linux中複製文檔操作系統

注意若是文件是放在遠程系統上的,無論它是一個 Web 服務器仍是在你本身網絡裏用文件共享協議訪問的另外一臺電腦,默認動做常常是複製而不是移動文件。版本控制

右擊

若是你以爲在你的桌面拖拽文檔不夠精準或者有點笨拙,或者這麼作會讓你的手離開鍵盤過久,你能夠常用右鍵菜單來複制文件。這取決於你所用的文件管理器,但一般來講,右鍵彈出的關聯菜單會包括常見的操做。
如何在Linux中複製文檔如何在Linux中複製文檔指針

關聯菜單的「複製」動做將你的文件路徑(即文件在系統的位置)保存在你的剪切板中,這樣你能夠將你的文件粘貼到別處:(LCTT 譯註:此處及下面的描述不確切,這裏並不是複製的文件路徑的「字符串」,而是複製了表明文件實體的對象/指針)對象

在這種狀況下,你並無將文件的內容複製到你的剪切版上。取而代之的是你複製了文件路徑。當你粘貼時,你的文件管理器會查看剪貼板上的路徑並執行復制命令,將相應路徑上的文件粘貼到你準備複製到的路徑。

 

命令行復制

 

雖然 GUI 一般是相對熟悉的複製文件方式,用終端複製卻更有效率。

cp

在終端上等同於在桌面上複製和粘貼文件的最顯而易見的方式就是 cp 命令。這個命令能夠複製文件和目錄,也相對直接。它使用熟悉的來源和目的(必須以這樣的順序)句法,所以複製一個名爲 example.txt 的文件到你的 Documents 目錄就像這樣:

$ cp example.txt ~/Documents

就像當你拖拽文件放在文件夾裏同樣,這個動做並不會將 Documents 替換爲 example.txt。取而代之的是,cp 察覺到 Documents 是一個文件夾,就將 example.txt 的副本放進去。

你一樣能夠便捷有效地重命名你複製的文檔:

$ 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

要複製一個目錄,你必須使用 -r 選項(表明 --recursive,遞歸)。以這個選項對目錄 nodes 運行 cp 命令,而後會做用到該目錄下的全部文件。沒有 -r 選項,cp 不會將目錄當成一個可複製的對象:

$ cp notes/ notes-backup
cp: -r not specified; omitting directory 'notes/'
$ cp -r notes/ notes-backup
cat

cat 命令是最易被誤解的命令,但這只是由於它表現了 POSIX 系統的極致靈活性。在 cat 能夠作到的全部事情中(包括其原意的鏈接文件的用途),它也能複製。例如說使用 cat 你能夠僅用一個命令就從一個文件建立兩個副本。你用 cp 沒法作到這一點。

使用 cat 複製文檔要注意的是系統解釋該行爲的方式。當你使用 cp 複製文件時,該文件的屬性跟着文件一塊兒被複制,這意味着副本的權限和原件同樣。

$ 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 將一個文件的內容讀取至另外一個文件是讓系統建立了一個新文件。這些新文件取決於你的默認 umask 設置。要了解 umask 更多的知識,請閱讀 Alex Juarez 講述 umask 以及權限概覽的文章。

運行 unmask 獲取當前設置:

$ umask
0002

這個設置表明在該處新建立的文檔被給予 664(rw-rw-r--)權限,由於該 unmask 設置的前幾位數字沒有遮掩任何權限(並且執行位不是文件建立的默認位),而且寫入權限被最終位所屏蔽。

當你使用 cat 複製時,實際上你並無真正複製文件。你使用 cat 讀取文件內容並將輸出重定向到了一個新文件:

$ 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 應用系統默認的 umask 設置建立了一個全新的文件。

最後,當你只是想複製一個文件時,這些手段可有可無。但若是你想複製文件並保持默認權限時,你能夠用一個命令 cat 完成一切。

rsync

有着著名的同步源和目的文件的能力,rsync 命令是一個複製文件的多才多藝的工具。最爲簡單的,rsync 能夠相似於 cp 命令同樣使用。

$ rsync example.txt example_copy.txt
$ ls
example.txt    example_copy.txt

這個命令真正的威力藏在其可以不作沒必要要的複製的能力裏。若是你使用 rsync 來將文件複製進目錄裏,且其已經存在在該目錄裏,那麼 rsync 不會作複製操做。在本地這個差異不是很大,但若是你將海量數據複製到遠程服務器,這個特性的意義就徹底不同了。

甚至在本地中,真正不同的地方在於它能夠分辨具備相同名字但擁有不一樣數據的文件。若是你曾發現你面對着同一個目錄的兩個相同副本時,rsync 能夠將它們同步至一個包含每個最新修改的目錄。這種配置在還沒有發現版本控制威力的業界十分常見,同時也做爲須要從一個可信來源複製的備份方案。

你能夠經過建立兩個文件夾有意識地模擬這種狀況,一個叫作 example 另外一個叫作 example_dupe:

$ mkdir example example_dupe

在第一個文件夾裏建立文件:

$ echo "one" > example/foo.txt

兩個目錄如今包含一樣的信息:

$ cat example/foo.txt
one
$ cat example_dupe/foo.txt
one

若是你看成源分支的文件發生改變,目的文件也會隨之跟新:

$ echo "two" >> example/foo.txt
$ rsync -av example/  example_dupe/
$ cat example_dupe/foo.txt
one
two

注意 rsync 命令是用來複制數據的,而不是充當版本管理系統的。例如假設有一個目的文件比源文件多了改變,那個文件仍將被覆蓋,由於 rsync 比較文件的分歧並假設目的文件老是應該鏡像爲源文件:

$ echo "You will never see this note again" > example_dupe/foo.txt
$ rsync -av example/  example_dupe/
$ cat example_dupe/foo.txt
one
two

若是沒有改變,那麼就不會有複製動做發生。

rsync 命令有許多 cp 沒有的選項,例如設置目標權限、排除文件、刪除沒有在兩個目錄中出現的過期文件,以及更多。可使用 rsync 做爲 cp 的強力替代或者有效補充。

 

許多複製的方式

 

在 POSIX 系統中有許多可以達成一樣目的的方式,所以開源的靈活性名副其實。我忘了哪一個複製數據的有效方式嗎?在評論區分享你的複製神技。

相關文章
相關標籤/搜索