複製檔案或目錄時保持所有權和檔案權限不變
前幾天我計劃將一些資料從我的 Ubuntu 桌面系統備份到外接 USB 硬碟。當我將所有資料傳輸到外接硬碟後,我注意到源端和目標端的檔案及目錄的擁有者和權限不同。但我希望在兩個位置上都保持現有的檔案屬性(例如擁有者、群組和時間戳等)不變。經過快速的 Google 搜尋並查看 "cp" 指令的手冊頁後,我發現我們可以 在 Linux 上複製檔案和目錄時保持擁有者和檔案權限不變。如果你曾遇到類似的情況,這裡有一個快速的解決方法。
在 Linux 上複製檔案或目錄時保持所有權和檔案權限不變
cp 命令有一個選項可以複製檔案和目錄,但保留原始檔案的修改時間、存取時間和模式。
$ cp -rp ~/data /media/sk/sk_seagate/data/在這裡,我正在將名為 "data" 的資料夾內容複製到我的外接硬碟。
來自 cp 指令的使用手冊頁面:
-p same as --preserve=mode,ownership,timestamps
--preserve[=ATTR_LIST]
preserve the specified attributes (default: mode,ownership,timestamps), if possible
additional attributes: context, links, xattr, all因此,如果你使用 -p 參數,它將保留所有現有的檔案屬性,例如模式、所有權和原始檔案的時間戳記。
而這裡使用 "-r" 標誌是用來遞歸複製目錄的。意思是 - 它會複製目錄及其子目錄和檔案。
或者,您可以使用 -a 參數。它包含 -r 參數並保留所有內容,例如鏈接、xattr、SELinux 屬性等。
$ cp -a ~/data /media/sk/sk_seagate/data/來自 cp 指令的手冊頁:
-a, --archive
same as -dR --preserve=all要驗證檔案的權限和所有權是否完整,請在來源和目標位置使用 getfacl 命令。
$ getfacl ~/data$ getfacl /media/sk/sk_seagate/data/如果您想在同一網路中的本地系統與遠端系統之間複製文件,您可以使用 "scp" 命令將文件從一個系統傳輸到另一個系統,如下所示。
$ scp -rp ~/data senthil@192.168.225.22:/home/senthil/上述命令將會將本地系統中名為 "data" 的內容資料夾複製到遠端系統。這裡,192168.225.22 是我的遠端系統的 IP 地址,而 "senthil" 是遠端系統的用戶名。
使用 "getfacl" 命令檢查兩個系統上 "data" 目錄的檔案權限和擁有者。
首先讓我們檢查本地系統上「data」目錄的檔案屬性:
$ getfacl data/範例輸出:
# file: data/
# owner: sk
# group: sk
user::rwx
group::rwx
other::r-x接下來,檢查遠端系統上「data」目錄的檔案屬性。你可以直接登入遠端系統,並使用如下的 ssh 指令來檢查遠端目錄的檔案屬性。
$ ssh senthil@192.168.225.22 getfacl data
範例輸出:
senthil@192.168.225.22's password:
# file: data
# owner: senthil
# group: senthil
user::rwx
group::rwx
other::r-x如您可能在上述輸出中注意到的,我的遠程系統上的擁有者和群組資訊(即 senthil)是不同的。因為 scp 命令的 -p 標誌並不會保留所有權限。
來自 scp 指令的 man 頁面:
-p Preserves modification times, access times, and modes from the original file.很明顯,-p 參數只會保留原始檔案的修改時間、存取時間和模式,但 不會保留擁有者。在這種情況下,你可以在兩個系統上建立相同的使用者名稱,並嘗試上述指令,以在不同系統上保留相同的擁有者和檔案權限。或者,簡單地在目標系統上使用 "chown" 指令來更改擁有者。
如需更多詳情,請參考 cp 和 scp 指令的 man 頁面。
$ man cp$ man scp建議閱讀:
- 如何同時複製文件並更改所有權和權限
希望這對你有幫助。