নেস্টেড জিপ ফাইলগুলি এক্সট্র্যাক্ট করা হচ্ছে


15

আমার কাছে অসংখ্য জিপ সংরক্ষণাগার রয়েছে, যার প্রত্যেকটিতে বেশ কয়েকটি জিপ সংরক্ষণাগার রয়েছে। এই জিপ সংরক্ষণাগার এবং এটির চাইল্ড জিপ সংরক্ষণাগারগুলির মধ্যে থাকা সমস্ত ফাইল পুনরাবৃত্তভাবে উত্তোলনের সর্বোত্তম উপায় কী, সেগুলি নিজেরাই জিপ সংরক্ষণাগার নয়?


জিপ ফাইল নয় এমন জিনিসগুলি বের করে কী বোঝাতে চান? আপনি তাদের অন্য জায়গায় অনুলিপি করতে চান?
ফুনেহে

আপনার প্রয়োজনীয়তা আমি পরিষ্কার দেখতে পাই না। আমি শন জে গফ এবং আমার ব্যাখ্যাটি সমান সম্ভাবনা সম্পর্কে পাই । আপনি কি স্পষ্ট করতে পারেন?
গিলস'স'- দুষ্ট হওয়া বন্ধ করুন '

@ গিলস: দুঃখিত, হ্যাঁ এটি কিছুটা অস্পষ্ট ছিল। আমি এটি কিছুটা পরিবর্তন করেছি, আশা করি এটি আরও পরিষ্কার clear
ওডামস

আমি একটি উত্তর পোস্ট করতে যাচ্ছিলাম, তবে আমি বিশ্বাস করি এটির একটি মন্তব্য হওয়া উচিত: নেস্টেড আর্কাইভগুলি আপনার প্রয়োজনীয় স্থানটি বাড়িয়ে তুলবে ! আপনি সম্ভবত জিপ ফাইল নয়, জিপ ফাইল ফর্ম্যাটটি বোঝাতে পারেন। প্রতিটি জিপ ফাইল ইতিমধ্যে সংকুচিত হয়, সেগুলি আবার সংকুচিত করে, আরও বেশি ওভারহেড তৈরি করে, কার্যকরভাবে কার্যকর স্থান বাড়িয়ে তোলে।
পোলেমন

হ্যাঁ, আমি এটি করিনি: পি। দুর্ভাগ্যক্রমে আমি ফাইল বিতরণ করার এই উদ্ভট পদ্ধতিতে পড়েছি।
ওডামস

উত্তর:


13

এটি তাদের মধ্যে থাকা কোনও জিপ ফাইলগুলি বাদ দিয়ে বর্তমান ডিরেক্টরিটিতে সমস্ত জিপ ফাইলগুলি বের করে আনবে।

find . -type f -name '*.zip' -exec unzip -- '{}' -x '*.zip' \;

যদিও এটি বর্তমান ডিরেক্টরিতে সামগ্রীগুলি বের করে, সমস্ত ডিরেক্টরি এই ডিরেক্টরিতে কঠোরভাবে শেষ হবে না কারণ বিষয়বস্তুতে সাব-ডিরেক্টরি অন্তর্ভুক্ত থাকতে পারে।

আপনি যদি বর্তমান ডিরেক্টরিটিতে সমস্ত ফাইল কঠোরভাবে চেয়েছিলেন, আপনি চালাতে পারেন

find . -type f -mindepth 2 -exec mv -- '{}' . \;

দ্রষ্টব্য: এটি যদি বিভিন্ন ডিরেক্টরিতে একই নামের দুটি থাকে তবে ক্লোবার ফাইলগুলি হবে।

আপনি যদি সমস্ত জিপ ফাইল এবং এর মধ্যে থাকা জিপগুলি পুনরাবৃত্তভাবে বের করতে চান তবে নীচে বর্তমান ডিরেক্টরিতে থাকা সমস্ত জিপ ফাইল এবং তাদের মধ্যে থাকা সমস্ত জিপগুলি বর্তমান ডিরেক্টরিতে সরিয়ে আনে।

while [ "`find . -type f -name '*.zip' | wc -l`" -gt 0 ]
do
    find . -type f -name "*.zip" -exec unzip -- '{}' \; -exec rm -- '{}' \;
done

এই সময়ে লুপ আমাকে নৈতিক হ্যাকিং প্রতিযোগিতায় অনেক সাহায্য করেছিল যেখানে তারা নেস্টেড জিপ ফাইলটি 31337 স্তর গভীর করে নিয়েছিল, ধন্যবাদ!
pedee

2
আপনি এই বৈকল্পিকটি পছন্দ করতে পারেন যা আমি ঘনঘন কান, যুদ্ধ, জার ফাইলগুলি থেকে বিষয়গুলি আহরণ করতে ব্যবহার করি: gist.github.com/tyrcho/479c18795d997c201e53 বড় পার্থক্য হ'ল এটি প্রতিটি আর্কাইভের জন্য নেস্টেড ফোল্ডার তৈরি করে। while [ "অনুসন্ধান . টাইপ চ-নাম '*।? আর' | ডাব্লুসিএল" -gt 0 ]; do find -type f -name "*.?ar" -exec mkdir -p '{}.dir' \; -exec unzip -d '{}.dir' -- '../{}' \; -exec rm -- '{}' \;; done
মিশেল ডেভিওট

4

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

এখানে একটি বাশ 4 স্ক্রিপ্ট রয়েছে যা বর্তমান ডিরেক্টরি এবং এর উপ-ডিরেক্টরিগুলি পুনরাবৃত্তভাবে সমস্ত জিপ আনজিপ করে, প্রতিটি জিপ ফাইল আনজিপ করার পরে সরিয়ে দেয় এবং যতক্ষণ জিপ ফাইল থাকে ততক্ষণ চলতে থাকবে। একটি উপ-ডিরেক্টরিতে একটি জিপ ফাইল সেই সাব-ডাইরেক্টরির তুলনায় উত্তোলন করা হয়। সতর্কতা: অপরিশোধিত, চেষ্টা করার আগে আসল ফাইলগুলির ব্যাকআপ তৈরি করুন বা rmজিপ ফাইল ডিরেক্টরি গাছের বাইরে নিয়ে গিয়ে প্রতিস্থাপন করুন ।

shopt -s globstar nullglob
while set -- **/*.zip; [ $# -ge 1 ] do
  for z; do
    ( cd -- "$(dirname "$z")" &&
      z=${z##*/} &&
      unzip -- "$z" &&
      rm -- "$z"
    )
  done
done

আপনি যদি shoptলাইনটি প্রতিস্থাপন করেন তবে স্ক্রিপ্টটি zsh এও কাজ করবে setopt nullglob

এখানে একটি বহনযোগ্য সমতুল্য। সমাপ্তির শর্তটি কিছুটা জটিল কারণ findএটি কোনও ফাইল খুঁজে পেয়েছে কিনা তা নির্ধারণ করার জন্য স্বতঃস্ফূর্তভাবে কোনও স্থিতি ফিরিয়ে দেয় না। সতর্কতা: উপরে হিসাবে।

while [ -n "$(find . -type f -name '*.zip' -exec sh -c '
    cd "${z%/*}" &&
    z=${z##*/} &&
    unzip -- "$z" 1>&2 &&
    rm -- "$z" &&
    echo 1
')" ]; do :; done

1

unzipএটি করবেন না, কারণ ইউনিক্সের উপায় হ'ল একটি কাজ করা এবং এটি ভালভাবে করা, প্রতিটি সরঞ্জামে সমস্ত ক্রেজি বিশেষ কেস পরিচালনা করা না। সুতরাং, আপনাকে শেলটি ব্যবহার করতে হবে (যা "জিনিসগুলিকে এক সাথে বেঁধে রাখার কাজ করে")। এটি এটিকে একটি প্রোগ্রামিং প্রশ্ন করে তোলে এবং যেহেতু স্ট্যাকওভারফ্লোতে সমস্ত সম্ভাব্য প্রোগ্রামিংয়ের প্রশ্নের উত্তর দেওয়া হয়েছে, আপনি : ইউনিক্স কমান্ড-লাইন থেকে ডিরেক্টরি এবং এর উপ-ডিরেক্টরিগুলিতে আর্কাইভগুলি কীভাবে পুনরুক্ত করে আনবেন ?


1
আমি অবশ্যই "শেলটি ব্যবহার করে" একটি প্রোগ্রামিং প্রশ্নকে কল করব না, এবং "শেল স্ক্রিপ্টিং" এ অনন্য বিষয় হিসাবে FAQ এ তালিকাভুক্ত করা হয়েছে
মাইকেল মরোজেক

আমি এটিকে এখানে মোটেও অফ-টপিক বলে বোঝানোর অর্থ দিচ্ছিলাম না, আমি কেবল স্ট্যাকওভারফ্লোতে এটি অন-টপিক কেন তা প্রমাণ করতে চেয়েছি।
থমাস থিমল

1

এই পার্ল স্ক্রিপ্টটি প্রতিটি .zip ফাইলকে তার নিজস্ব উপ-ডিরেক্টরিতে উত্তোলন করবে। নেস্টেড জিপ ফাইলগুলি পরিচালনা করতে একাধিকবার স্ক্রিপ্টটি চালান। এটি নিষ্কাশনের পরে .zip ফাইলগুলি মুছবে না তবে আপনি আনলিংক () কল যোগ করে সেই পরিবর্তন করতে পারেন।

#!/usr/bin/perl -w

# This script unzips all .zip files it finds in the current directory
# and all subdirectories.  Contents are extracted into a subdirectory
# named after the zip file (eg. a.zip is extracted into a/).
# Run the script multiple times until all nested zip files are
# extracted.  This is public domain software.

use strict;
use Cwd;

sub process_zip {
    my $file = shift || die;
    (my $dir = $file) =~ s,/[^/]+$,,;
    (my $bare_file = $file);
    $bare_file =~ s,.*/,,;
    my $file_nopath = $bare_file;
    $bare_file =~ s,\.zip$,,;
    my $old_dir = getcwd();
    chdir($dir) or die "Could not chdir from '$old_dir' to '$dir': $!";
    if (-d $bare_file) {
        chdir($old_dir);
        # assume zip already extracted
        return;
    }
    mkdir($bare_file);
    chdir($bare_file);
    system("unzip '../$file_nopath'");
    chdir($old_dir);
}

my $cmd = "find . -name '*.zip'";
open(my $fh, "$cmd |") or die "Error running '$cmd': $!";
while(<$fh>) {
    chomp;
    process_zip($_);
}

1

সহজ উপায় হ'ল অ্যাটল ব্যবহার করুন : http://www.nongnu.org/atool/ এটি একটি খুব ভাল স্ক্রিপ্ট যা কোনও সংরক্ষণাগার উত্তোলনের জন্য জিপ, আনজিপ, টার, রাআর ইত্যাদি প্রোগ্রাম ব্যবহার করে।

atool -x package_name.zipএগুলি সমস্ত আনজিপ করতে ব্যবহার করুন বা আপনি যদি অনেক জিপ ফাইল সহ ডিরেক্টরিতে এটি ব্যবহার করতে চান তবে সাধারণ forলুপ ব্যবহার করুন :

for f in *; do atool -x $f; fi(এটি cdব্যবহারের আগে আপনাকে জিপ ফাইল সহ কাঙ্ক্ষিত ডিরেক্টরিতে প্রবেশ করতে হবে )।


atoolআমি এখানে বলব আনজিপ থেকে এখানে এর আচরণটি উল্লেখযোগ্যভাবে আলাদা নয়, এটি জিপ ফাইলগুলি পুনরাবৃত্তভাবে এক্সট্রাক্ট করে না।
থমাস থিমল

@ থমাস থিমল: আপনি কি নিশ্চিত যে এটি বারবার জিপ ফাইলগুলি বের করে না? এটি ডিবে ফাইলগুলি থেকে টর.gz নিয়মিতভাবে নিষ্কাশন করতে পারে তবে নেস্টেড জিপ সংরক্ষণাগারগুলির সাথে এটি পরীক্ষা করার আমার কাছে কোনও সময়ই এটিম নেই:

0

আপনি জিপ ফাইলের ভিতরে জিপ ফাইলগুলি স্বয়ংক্রিয়ভাবে আনজিপিং করতে সাবধান হতে চাইবেন:

http://research.swtch.com/2010/03/zip-files-all-way-down.html

আউটপুট হিসাবে একটি জিপ ফাইল তৈরি করে এমন একটি জিপ ফাইল তৈরি করা সম্ভব, যা আউটপুট হিসাবে একটি জিপ ফাইল তৈরি করে ইত্যাদি ইত্যাদি That

এছাড়াও, আমি মনে করি লোকেরা জিপ ফাইলগুলি তৈরি করে যা "বিস্ফোরিত হবে", এটি খুব ছোট একটি জিপ ফাইল মাল্টি-গিগাবাইট আউটপুট থেকে আনজিপ করবে। এটি সংকোচনের পদ্ধতির একটি দিক।


0

হতে পারে এটি সাহায্য করবে (আমার জন্য কাজ করেছে):

function unzipAll(){

# find and count archives
archLst=`find . -type f -name "*.*ar"`
archLstSize=`echo $archLst| awk 'END{print NF}'`

# while archives exists do extract loop
while [ "$archLstSize" -gt 0 ]; do

# extract and remove all archives (found on single iteration)
for x in $archLst; do 
mv "${x}" "${x}_";
unzip "${x}_" -d "${x}" && rm "${x}_"; 
done; #EO for

# find and count archives
archLst=`find . -type f -name "*.*ar"`
archLstSize=`echo $archLst| awk 'END{print NF}'`

done #EO while

}

0

আমার ২০১০ সাল থেকে গিলসের মতো সমাধান দরকার, ফোল্ডার কাঠামো সংরক্ষণের দরকার ছাড়া, শীর্ষ স্তরের ডিরেক্টরিতে সমস্ত কিছু আনজিপ না করে। এখানে তার সাথে তিনটি লাইন যুক্ত / পরিবর্তিত রয়েছে:

#!/bin/bash
shopt -s globstar nullglob
while set -- **/*.zip; [ $# -ge 1 ]
do
    for z
    do
        ( cd -- "$(dirname "$z")" &&
            z=${z##*/} &&
            cp -- "$z" "$z".bak &&
            mkdir -- "$z"dir &&
            unzip -- "$z" -d "$z"dir &&
            rm -- "$z"
        )
    done
done

0

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

java -jar nzip.jar -c list -s readme.zip

java -jar nzip.jar -c extract -s "C: \ project \ readme.zip" -t Readme

java -jar nzip.jar -c কম্প্রেস -s রিডমে -t "সি: \ প্রকল্প \ রিডমে.জিপ"

পুনশ্চ. আমি লেখক এবং দ্রুত যে কোনও বাগ ঠিক করতে পেরে খুশি হব।

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