次のディレクトリにあるファイルがあります。
folder_A/another_folder_A/file_to_add.xml
さて、私がやりたいのは、ファイルを既存のZipアーカイブのフォルダーに追加することです。
たとえば、これは私の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
同じ名前のフォルダを作成して追加したくありません。それを可能にするコマンドはありますか?
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);
?>
ディレクトリの名前がzipファイルの内外で同じであれば、非常に簡単です。 folder
を含むディレクトリで、Zip my_Zip.zip folder -r
を実行できます。
Zipファイルの内側と外側の構造が完全に同じでない場合は、前の方法を適用する前に手動で再作成する必要があります。私が知る限り(そしてupdate
(-u
)などの興味深いが無視されている関数のmanページをチェックインした後)、zipファイル内の任意のディレクトリにファイルを配置する方法はありません。