Bash

如何在維護目錄和文件權限的同時從給定的完整路徑列表中 tar.gz 所有文件和目錄?

  • October 15, 2020

我如何創建一個tar.gz

  1. 完整路徑文件的列表(例如/root/test/abcd/123.txt
  2. 包括目錄和文件
  3. 提取時保留文件和目錄的所有權和權限?

這就是我的文件列表 ( dbfiles.log) 的樣子:

[oracle@test ~]$ cat dbfiles.log
/u01/app/oracle/product/12.2.0/dbhome_1/dbs/initDEVR.ora
/u01/app/oracle/product/12.2.0/dbhome_1/dbs/orapwDEVR
/u01/app/oracle/product/12.2.0/dbhome_1/dbs/spfileDEVR.ora
/u01/app/oracle/oradata/DEVR/control01.ctl
/u01/app/oracle/oradata/DEVR/control02.ctl
/u01/app/oracle/oradata/DEVR/redo01.log
/u01/app/oracle/oradata/DEVR/redo02.log
/u01/app/oracle/oradata/DEVR/redo03.log
/u01/app/oracle/oradata/DEVR/sysaux01.dbf
/u01/app/oracle/oradata/DEVR/system01.dbf
/u01/app/oracle/oradata/DEVR/temp01.dbf
/u01/app/oracle/oradata/DEVR/undotbs01.dbf
/u01/app/oracle/oradata/DEVR/users01.dbf
[oracle@test ~]$

這就是我今天的做法:

tar -czvf TARFILENAME.tar.gz -T dbfiles

但是解壓後需要手動配置權限。順便說一句,我必須使用sudo來提取文件,因此目錄會根據需要獲得root:root所有權,而不是原始文件。oracle:oinstall

我發現一些參考資料表明 tar 的標誌--no-recursion可以解決問題:

tar -zcf file.tgz --no-recursion abc --recursion abc/def

我相信這是正確的方法,但我不確定如何使用我的文件列表進行這項工作。也許使用find遍歷列表並將輸出發送到壓縮包?老實說,我不確定。

我最終找到了解決方案。這是以防其他人需要:

awk -F/ '{ d=$1; for (i=2; i <= NF; i++) { print d; d=d "/" $i }; print d }' dbfiles | awk '{ if (index(old,$0 "/") != 1) { old=$0; print } }' | tar czvf $LOCALFS/$TARFILENAME.tar.gz --no-recursion -T -

感謝誰回答了我最初的問題。

對於壓縮,您可以使用tar -cvpf filename.tar.gz目錄。

提取時,使用--same-owner參數。例如tar -xvzf --same-owner filename.tar.gz

引用自:https://unix.stackexchange.com/questions/614662