저는 실제로 개발 목적으로 Windows OS에서 작업하고 있습니다. Linux 기반 시스템에 배포하려는 일부 구성 파일이 있습니다. Windows의 결과 zip 구조는 대상과 동일합니다.
Linux 시스템에서 내 아카이브의 압축을 풀면 unzip 명령은 원본 파일의 소유자를 압축을 푼 사용자(루트)로 변경합니다.
감압 전:
[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
덮어쓴 모든 파일의 백업을 유지하는 것입니다. 그런 다음 ( /output 에서 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