Bash
如何在維護目錄和文件權限的同時從給定的完整路徑列表中 tar.gz 所有文件和目錄?
我如何創建一個
tar.gz
從
- 完整路徑文件的列表(例如
/root/test/abcd/123.txt
)- 包括目錄和文件
- 提取時保留文件和目錄的所有權和權限?
這就是我的文件列表 (
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