다음 디렉토리에 파일이 있습니다.
folder_A/another_folder_A/file_to_add.xml
이제 내가 원하는 것은 기존 zip 아카이브 내의 폴더에 파일을 추가하는 것뿐입니다.
예를 들어, 내 우편번호의 내용은 다음과 같습니다.
my_zip.zip/folder_B/another_folder_B
어떻게 추가할 수 file_to_add.xml
있나요 another_folder_B
?
my_zip.zip/folder_B/another_folder_B/file_to_add.xml
같은 이름의 폴더를 만들어 추가하고 싶지 않습니다. 내가 이 일을 하도록 허락하는 명령이 있습니까?
답변1
7z
또는 도구를 통해 zip
직접 수행하는 방법을 모릅니다. 그러나 대부분의 라이브러리(perl, python 등)에는 zip
모듈이 있는 것 같습니다. 불가능하지만 Bash에서는 가능합니다.
다음은 PHP의 간단한 예입니다.
테스트 사례:
$ mkdir -p A/B C/D E/F
$ touch A/B/f1.txt C/D/f2.txt E/F/f3.txt
$ tree .
.
├── A
│ └── B
│ └── f1.txt
├── C
│ └── D
│ └── f2.txt
├── E
│ └── F
│ └── f3.txt
$ ./php_zip -v out.zip -p x/y */*/f?.txt
$ 7z l out.zip
Listing archive: out.zip
Path = out.zip
Type = zip
Physical Size = 310
Date Time Attr Size Compressed Name
------------------- ----- ------------ ------------ ------------------------
2013-04-28 10:24:36 ..... 0 0 x/y/f1.txt
2013-04-28 10:24:36 ..... 0 0 x/y/f2.txt
2013-04-28 10:24:36 ..... 0 0 x/y/f3.txt
------------------- ----- ------------ ------------ ------------------------
0 0 3 files, 0 folders
용법:
./php_zip [-v|--verbose] archive.zip [<-p|--path> archive-path] files ...
--verbose Verbose; print what is added and where.
archive.zip Output file. Created if does not exist, else extended.
--path Target path in zip-archive where to add files.
If not given source path's are used.
files 0+ files.
If -P or --Path (Capital P) is used empty directory entries is added as well.
암호:
(오랫동안 PHP 코드를 작성하지 않았습니다. 어쨌든 이 코드는 확장을 위한 예일 뿐입니다.)
#!/usr/bin/php
<?php
$debug = 0;
function usage($do_exit=1, $ecode=0) {
global $argv;
fwrite(STDERR,
"Usage: " . $argv[0] .
" [-v|--verbose] archive.zip" .
" [<-p|--path> archive-path]" .
" files ...\n"
);
if ($do_exit)
exit($ecode);
}
$zip_eno = array(
ZIPARCHIVE::ER_EXISTS => "EXISTS",
ZIPARCHIVE::ER_INCONS => "INCONS",
ZIPARCHIVE::ER_INVAL => "INVAL",
ZIPARCHIVE::ER_MEMORY => "MEMORY",
ZIPARCHIVE::ER_NOENT => "NOENT",
ZIPARCHIVE::ER_NOZIP => "NOZIP",
ZIPARCHIVE::ER_OPEN => "OPEN",
ZIPARCHIVE::ER_READ => "READ",
ZIPARCHIVE::ER_SEEK => "SEEK"
);
function zip_estr($eno) {
switch ($eno) {
case ZIPARCHIVE::ER_EXISTS:
}
}
if ($debug)
print_r($argv);
if ($argc > 1)
if ($argv[1] == "-h" || $argv[1] == "--help")
usage();
if ($argc < 3)
usage(1, 1);
$verbose = 0;
$path = "";
$add_dir = 0;
$zip = new ZipArchive();
$i = 1;
if ($argv[$i] == "-v" || $argv[$i] == "--verbose") {
if ($argc < 4)
usage(1, 1);
$verbose = 1;
++$i;
}
$zip_flag = file_exists($argv[$i]) ?
ZIPARCHIVE::CHECKCONS :
ZIPARCHIVE::CREATE;
if (($eno = $zip->open($argv[$i++], $zip_flag)) !== TRUE) {
fwrite(STDERR,
"ERR[$eno][$zip_eno[$eno]]: ".
"Unable to open archive " .
$argv[$i - 1] . "\n"
);
exit($eno);
}
if (
$argv[$i] == "-P" || $argv[$i] == "--Path" ||
$argv[$i] == "-p" || $argv[$i] == "--path"
) {
if ($argc - $i < 2)
usage(1, 1);
$path = $argv[$i + 1];
if (substr($path, -1) !== "/")
$path .= "/";
if ($argv[$i][1] == "P")
$zip->addEmptyDir($path);
$i += 2;
}
$eno = 0;
for (; $i < $argc; ++$i) {
if ($path !== "")
$target = $path . basename($argv[$i]);
else
$target = $argv[$i];
if ($verbose)
printf("Adding %s to %s\n", $argv[$i], $target);
if (!$zip->addFile($argv[$i], $target)) {
fwrite(STDERR, "Failed.\n");
$eno = 1;
}
}
$zip->close();
exit($eno);
?>
답변2
zip 파일 내부와 외부의 디렉터리 이름이 동일하면 매우 간단합니다. 포함된 디렉토리에서 folder
다음을 수행할 수 있습니다 zip my_zip.zip folder -r
.
zip 파일 내부와 외부의 구조가 정확히 일치하지 않는 경우 이전 방법을 적용하기 전에 수동으로 다시 생성해야 합니다. 내가 아는 한(매뉴얼 페이지에서 update
( -u
)와 같은 흥미롭지만 무시되는 기능을 확인한 후) 파일을 zip 파일 내의 임의 디렉토리에 넣을 수 있는 방법은 없습니다.