網站搜尋

複製檔案或目錄時保持所有權和檔案權限不變


前幾天我計劃將一些資料從我的 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

建議閱讀:

  • 如何同時複製文件並更改所有權和權限

希望這對你有幫助。