如何 tar.gz 给定完整路径列表中的所有文件和目录,同时维护目录和文件权限?

如何 tar.gz 给定完整路径列表中的所有文件和目录,同时维护目录和文件权限?

我如何创建一个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遍历列表并将输出发送到 tarball?老实说我不确定。

答案1

为了压缩,您可以使用tar -cvpf filename.tar.gz目录。

提取时,使用--same-owner参数。例如tar -xvzf --same-owner filename.tar.gz

答案2

我最终找到了解决方案。这是以防其他人需要:

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 -

感谢谁回答了我最初的问题。

相关内容