라는 파일이 있습니다'sourceZip.zip'
이 파일( 'sourceZip.zip'
)에는 두 개의 파일이 포함되어 있습니다.
'textFile.txt'
'binFile.bin'
나한테 전화한 또 다른 사람도 있어'targetZip.zip'
파일( 'targetZip.zip'
)에는 다음 파일이 포함되어 있습니다.
'jpgFile.jpg'
'textFile.txt'
Linux에서 두 파일( , 'binFile.bin'
)을 소스 아카이브( 'sourceZip.zip'
)에서 두 번째 아카이브( 'targetZip.zip'
)로 직접 복사하여 프로세스가 끝나면 두 번째 아카이브( 'targetZip.zip'
)에 세 파일이 모두 포함되도록 하려면 어떤 bash 명령을 사용해야 합니까 ?
(이상적으로는 "zip" 또는 "unzip"을 사용하여 하나의 명령으로 이 작업을 수행할 수 있습니다)
답변1
일반적인 명령줄 zip
도구를 사용하면 별도의 추출 및 업데이트 명령을 피할 수 없을 것 같습니다.
source_zip=$PWD/sourceZip.zip
target_zip=$PWD/targetZip.zip
temp_dir=$(mktemp -dt)
( cd "$temp_dir"
unzip "$source_zip"
zip -g "$targetZip" .
# or if you want just the two files: zip -g "$targetZip" textFile.txt binFile.bin
)
rm -rf "$temp_dir"
더 편리한 zip 파일 조작 라이브러리를 갖춘 다른 언어가 있습니다. 예를 들어, 펄과아카이브::우편번호. 오류 검사를 생략합니다.
use Archive::Zip;
my $source_zip = Archive::Zip->new("sourceZip.zip");
my $target_zip = Archive::Zip->new("targetZip.zip");
for my $member ($source_zip->members()) {
# or (map {$source_zip->memberNamed($_)} ("textFile.txt", "binFile.bin"))
$target_zip->addMember($member);
}
$target_zip->overwrite();
또 다른 방법은 zip 파일을 디렉터리로 마운트하는 것입니다. zip 파일 중 하나를 마운트하면 충분합니다. zip
또는 다른쪽에 사용할 수 있습니다.unzip
AVFS다양한 아카이브 형식에 대한 읽기 전용 지원을 제공합니다.
mountavfs
target_zip=$PWD/targetZip.zip
(cd "$HOME/.avfs$PWD/sourceZip.zip#" &&
zip -g "$target_zip" .) # or list the files, as above
umountavfs
퓨즈 지퍼.zip 아카이브를 사용할 수 있도록 zip 아카이브에 대한 읽기 및 쓰기 액세스를 제공합니다 cp
.
source_dir=$(mktemp -dt)
target_dir=$(mktemp -dt)
fuse-zip sourceZip.zip "$source_dir"
fuse-zip targetZip.zip "$target_dir"
cp -Rp "$source_dir/." "$target_dir" # or list the files, as above
fusermount -u "$source_dir"
fusermount -u "$target_dir"
rmdir "$source_dir" "$target_dir"
경고: 저는 이 스크립트를 브라우저에 직접 입력합니다. 자신의 책임하에 사용하십시오.
답변2
불확실한다음에 추가보관되었지만 언제든지 다시 만들 수 있습니다.
unzip a.zip -d tmp
unzip b.zip -d tmp
zip -r c.zip tmp
처음 두 줄은 아카이브의 압축을 tmp
디렉터리에 풀고, 세 번째 줄은 다시 압축을 풉니다.
답변3
zipmerge
이를 수행하는 도구가 있습니다 . 페이지 설명은 man
다음과 같습니다.
zipmerge 소스 zip 아카이브 source-zip을 대상 zip 아카이브 target-zip에 병합합니다. 기본적으로 소스 zip 아카이브의 파일은 대상 zip 아카이브에 있는 동일한 이름의 기존 파일을 덮어씁니다.
답변4
저는 솔직하게 말씀드리지만, 실용적인 관점에서 보면 답을 모르겠습니다.
그러나 이론적인 관점에서 볼 때 반드시 파일의 압축을 풀고 다시 압축해야 합니다. 물론 압축된 상태로 이동할 수는 없나요? 먼저 두 zip 파일의 압축 모드 및 수준 설정이 동일하다고 가정해야 합니다.
unzip과 zip 명령을 함께 연결할 수 있지만 그렇게 되면 명령줄에서 명령을 처리하는 문제가 되므로 *nix 전문가에게 맡기겠습니다.
나는 항상 교정할 준비가 되어 있습니다.