使用备份文件

使用备份文件

实际上,我正在开发 Windows 操作系统以进行开发。我有一些配置文件,我想将其部署在基于 Linux 的系统上。 Windows 上生成的 zip 结构与目标相同。

当我在 Linux 系统中解压我的存档时,unzip 命令将原始文件的所有者更改为进行解压的用户(root)。

解压前:

[root@supermachine /]# ll /myRootFolder -R
/myRootFolder:
total 4
-rw-r--r-- 1 superman superman  5 21 août  10:18 file.TXT
drwxr-xr-x 2 superman superman 25 21 août  10:17 mySubFolder

/myRootFolder/mySubFolder:
total 4
-rw-r--r-- 1 superman superman 4 21 août  10:17 subFile.TXT

解压后

[root@supermachine /]# unzip myRootFolder.zip
Archive:  myRootFolder.zip
replace myRootFolder/file.TXT? [y]es, [n]o, [A]ll, [N]one, [r]ename: y
 extracting: myRootFolder/file.TXT
replace myRootFolder/mySubFolder/subFile.TXT? [y]es, [n]o, [A]ll, [N]one, [r]ename: y
 extracting: myRootFolder/mySubFolder/subFile.TXT

[root@supermachine /]# ll /myRootFolder -R
/myRootFolder:
total 4
-rw-r--r-- 1 root     root      5 21 août  10:18 file.TXT
drwxr-xr-x 2 superman superman 25 21 août  10:21 mySubFolder

/myRootFolder/mySubFolder:
total 4
-rw-r--r-- 1 root root 4 21 août  10:17 subFile.TXT

有关信息,解压版本为:

[root@supermachine /]$ unzip -v
UnZip 6.00 of 20 April 2009, by Info-ZIP.  Maintained by C. Spieler.  Send
bug reports using http://www.info-zip.org/zip-bug.html; see README for details.

Latest sources and executables are at ftp://ftp.info-zip.org/pub/infozip/ ;
see ftp://ftp.info-zip.org/pub/infozip/UnZip.html for other sites.

Compiled with gcc 4.8.5 20150623 (Red Hat 4.8.5-26) for Unix (Linux ELF) on Jan 10 2018.

UnZip special compilation options:
        COPYRIGHT_CLEAN (PKZIP 0.9x unreducing method not supported)
        SET_DIR_ATTRIB
        SYMLINKS (symbolic links supported, if RTL and file system permit)
        TIMESTAMP
        UNIXBACKUP
        USE_EF_UT_TIME
        USE_UNSHRINK (PKZIP/Zip 1.x unshrinking method supported)
        USE_DEFLATE64 (PKZIP 4.x Deflate64(tm) supported)
        UNICODE_SUPPORT [wide-chars, char coding: UTF-8] (handle UTF-8 paths)
        MBCS-support (multibyte character support, MB_CUR_MAX = 6)
        LARGE_FILE_SUPPORT (large files over 2 GiB supported)
        ZIP64_SUPPORT (archives using Zip64 for large files supported)
        USE_BZIP2 (PKZIP 4.6+, using bzip2 lib version 1.0.6, 6-Sept-2010)
        VMS_TEXT_CONV
        [decryption, version 2.11 of 05 Jan 2007]

UnZip and ZipInfo environment options:
           UNZIP:  [none]
        UNZIPOPT:  [none]
         ZIPINFO:  [none]
      ZIPINFOOPT:  [none]

zip 命令是否有一个选项可以保留粉碎文件的原始所有者?我阅读了手册,但我看到了与这些案例相关的任何内容。

笔记 :如果有其他类型存档的解决方案,它也可以解决我的问题(我可以生成其他存档格式)。

答案1

您可以尝试使用 su 命令以您想要拥有这些文件的用户身份运行解压缩:

su -c "unzip myRootFolder.zip" superman 

su 允许您以另一个用户身份运行命令,或在当前登录会话中暂时成为该用户。跑步

man su

有关命令的完整说明。

答案2

unzip没有功能可以精确执行您所描述的操作。

当它问你的时候

replace myRootFolder/file.TXT? [y]es, [n]o, [A]ll, [N]one, [r]ename:

你回答说y,“替换”意味着它在提取新副本之前删除了原始文件。原始文件消失了,包括其所有元数据(所有者、权限、时间戳)。

使用备份文件

可以满足您部分需求的选项是-B保留所有覆盖文件的备份。之后,您应该看到(在/输出unzip -B中)除了更新文件外,还有名称末尾带有 的原始文件:llls~

-rw-r--r-- 1 superman superman  5 21 août  10:18 file.TXT~
-rw-r--r-- 1 root     root      5 21 août  10:18 file.TXT

从那里,您需要使用 将每个备份文件的所有权复制到新文件chown,然后删除备份文件。

你可以用例如来做到这一点。find -exec:

find myRootFolder -name "*~" -exec bash -c 'bak="{}";
  new="${bak%\~}";
  chown --reference "$bak" "$new" ; rm "$bak"' \;

~但如果在创建任何备份之前您已经有以 , 结尾的文件名,这将导致问题。

或者,您可以列出 zip 内容(使用Info-ZIP 中包含的命令),并且对于每个内容,在执行...zipinfo之前检查是否存在备份。chownrm

zipinfo -1 myRootFolder.zip | grep -v '$/' | while read new ; do
  bak="${new}~"
  test -e "$bak" || continue
  chown --reference "$bak" "$new"
  rm "$bak"
done

相关内容