Non so un modo per fare questo 7z
o zip
strumenti direttamente. Ma supponiamo che la maggior parte delle librerie come perl, python ecc. Abbia un zip
modulo. Non puoi, comunque farlo in Bash.
Ecco un semplice esempio in PHP:
Caso di prova:
$ 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
Uso:
./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.
Codice:
(Non ho programmato PHP per molto tempo. Il codice è comunque inteso solo come esempio da espandere o altro.)
#!/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);
?>