Fügen Sie eine Datei einem anderen Pfad in einer Zip-Datei hinzu

9

Ich habe eine Datei im folgenden Verzeichnis abgelegt:

folder_A/another_folder_A/file_to_add.xml

Jetzt möchte ich die Datei einfach einem Ordner in einem vorhandenen Zip-Archiv hinzufügen.

Zum Beispiel ist dies mein Zip-Inhalt:

my_zip.zip/folder_B/another_folder_B

Wie kann ich das hinzufügen , file_to_add.xmlum die another_folder_B?

my_zip.zip/folder_B/another_folder_B/file_to_add.xml

Ich möchte keine gleichnamigen Ordner erstellen und hinzufügen. Gibt es einen Befehl, mit dem ich das tun kann?

Daniel-B
quelle

Antworten:

2

Kennen Sie keine Möglichkeit, dies durch 7zoder zipWerkzeuge direkt zu tun . Aber die meisten Bibliotheken wie Perl, Python usw. haben ein zipModul. Sie können es jedoch nicht in Bash tun.


Hier ist ein einfaches Beispiel in PHP:

Testfall:

$ 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

Verwendungszweck:

./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.

Code:

(Habe PHP schon lange nicht mehr codiert. Der Code ist sowieso nur als Beispiel gedacht, um erweitert zu werden oder andere.)

#!/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);
?>
Runium
quelle
0

Wenn Ihre Verzeichnisse innerhalb und außerhalb der Zip-Datei denselben Namen haben, ist dies ziemlich einfach. In dem Verzeichnis, das enthält folder, können Sie tun zip my_zip.zip folder -r.

Wenn Ihre Struktur innerhalb und außerhalb der Zip-Datei nicht exakt identisch ist, müssen Sie sie manuell neu erstellen, bevor Sie die vorherige Methode anwenden. Soweit ich das beurteilen kann (und nachdem ich in der Manpage nach interessanten, aber eher ignorierten Funktionen wie update( -u) gesucht habe), gibt es keine Möglichkeit, eine Datei in ein beliebiges Verzeichnis innerhalb einer Zip-Datei zu legen.

lgeorget
quelle