একটি জিপ ফাইলে একটি পৃথক পথে একটি ফাইল যুক্ত করুন


9

আমার কাছে একটি ফাইল রয়েছে যা নিম্নলিখিত ডিরেক্টরিতে রেখেছি:

folder_A/another_folder_A/file_to_add.xml

এখন, আমি যা করতে চাই তা হ'ল বিদ্যমান জিপ সংরক্ষণাগারটিতে ফোল্ডারে কেবল ফাইল যুক্ত করা।

উদাহরণস্বরূপ এটি আমার জিপ সামগ্রী:

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

আমি একই নামের সাথে ফোল্ডার তৈরি করতে এবং সেগুলি যুক্ত করতে চাই না। এমন কোন আদেশ আছে যা আমাকে তা করার অনুমতি দেয়?

উত্তর:


2

এটি করার উপায় 7zবা zipসরঞ্জামগুলি সরাসরি জানেন না । তবে, অনুমান করুন বেশিরভাগ লাইব্রেরি যেমন পার্ল, পাইথন ইত্যাদির একটি zipমডিউল রয়েছে। আপনি তবে এটি বাশে করতে পারবেন না।


এখানে পিএইচপি-তে একটি সাধারণ উদাহরণ রয়েছে:

পরীক্ষা ক্ষেত্রে:

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

কোড:

(পিএইচপি দীর্ঘ সময় কোড করে নি। কোডটি কোনওভাবেই কেবল প্রসারিত বা অন্য কোনও উদাহরণ হিসাবে বোঝানো হয়েছে))

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

0

আপনার ডিরেক্টরিগুলি যদি জিপফাইলের অভ্যন্তরে এবং বাইরে একই নামে থাকে তবে এটি বেশ সহজ। ধারণকারী ডিরেক্টরিতে folder, আপনি এটি করতে পারেন zip my_zip.zip folder -r

জিপফাইলের অভ্যন্তরে এবং বাইরে যদি আপনার কাঠামো ঠিক একই না হয় তবে পূর্ববর্তী পদ্ধতিটি প্রয়োগ করার আগে আপনাকে ম্যানুয়ালি এটি পুনরায় তৈরি করতে হবে। আমি যতদূর বলতে পারি (এবং ম্যান পেজে চেক করার পরেও আকর্ষণীয় হয়ে বরং উপেক্ষা করা ফাংশনগুলির মতো update( -u)) কোনও জিপফাইলে অভ্যন্তরীণ ডিরেক্টরিতে কোনও ফাইল রাখার উপায় নেই।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.