实际上,我正在开发 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
中)除了更新文件外,还有名称末尾带有 的原始文件:ll
ls
~
-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
之前检查是否存在备份。chown
rm
zipinfo -1 myRootFolder.zip | grep -v '$/' | while read new ; do
bak="${new}~"
test -e "$bak" || continue
chown --reference "$bak" "$new"
rm "$bak"
done