কীভাবে একটি জিপ ফাইল "আনসেক্ট্র্যাক্ট" করবেন?


52

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


উম্মু গ্রহণের জন্য ধন্যবাদ, তবে এটি সত্যিই @ জিনের ধারণা ছিল। আমি lqবিকল্পগুলির জন্য সচেতন ছিলাম না unzizp, আমি তার মূল উত্তরের চারপাশে কয়েকটি ক্লাসিক * নিক্স ট্রিকস যুক্ত করেছি।
টেরডন

এটা ঠিক আছে, আমি সত্যিই এত কিছু করি না। আমি যাইহোক হোয়াইটস্পেস হ্যান্ডলিংয়ের নিজস্ব নিজস্ব সংস্করণ যুক্ত করেছি।
jjlin

@ ইটারডন হ্যাঁ ... আমি জিজলিনের উত্তরকেও উজ্জীবিত করেছি, তবে আমি কেবল একটি উত্তর গ্রহণ করতে পারি।
mafp

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

@ জো এর এর ব্যবহার রয়েছে। ল্যাটেক্স প্যাকেজগুলি, যেমন একটি foo.tds.zipফর্মে আসতে পারে। এই জিপগুলি একটি টেক্সএমএফ গাছে মিশে যায় যা খুব সুবিধাজনক। তবে আপনি যদি কখনও এই জাতীয় প্যাকেজটি সরাতে চান তবে আমি বর্ণিত সমস্যার মুখোমুখি হয়েছি।
mafp

উত্তর:


28

জিলিনের উত্তর হ'ল উপায়। আমি কেবল ডিরেক্টরিগুলির জন্য কয়েকটি পছন্দ যুক্ত করতে চাই:

  • সমস্ত এক্সট্রাক্ট করা ফাইল, কোনও ডিরেক্টরি মুছুন :

    unzip -lqq file.zip | gawk -F"  " '{print $NF;}' |
      while IFS= read -r n; do rm "$n"; done
  • এক্সট্রাক্ট করা ফাইল এবং খালি ডিরেক্টরিগুলি মুছুন

    unzip -lqq file.zip | gawk -F"  " '{print $NF;}' |
      while IFS= read -r n; do rm "$n"; done; rmdir *

    কোনও বিকল্প নেই, rmdirকেবল খালি ডিরেক্টরি মুছে ফেলা হয়, এটি ফাইল এবং খালি খালি ফোল্ডারগুলিকে একা ফেলে দেবে যাতে আপনি এটি নিরাপদে চালাতে পারেন *

  • নিষ্কাশিত সমস্ত কিছু মুছুন , তবে প্রতিটি মোছার আগে একটি নিশ্চিতকরণের জন্য অনুরোধ করুন:

    unzip -lqq file.zip | gawk -F"  " '{print $NF;}' |
      while IFS= read -r n; do rm -ri "$n"; done; rmdir *

    -iপতাকা কারণ হবে rmযে অপসারণের আগে সূচিত জন্য, আপনাকে হ্যাঁ অথবা নং নির্বাচন করতে পারবেন

  • নিষ্কাশন সমস্ত কিছু মুছে দিন , ডিরেক্টরি অন্তর্ভুক্ত:

    unzip -lqq file.zip | gawk -F"  " '{print $NF;}' |
      while IFS= read -r n; do rm -rf "$n"; done

খালি ডিরেক্টরি মুছে ফেলা সহজেই এর সাথে সম্পন্ন হয় find: find * -depth -type d -exec rmdir {} +এবং সমস্ত Directory not emptyবার্তা উপেক্ষা করুন। বিকল্পটি স্যুইচ করার সাথে find * -type d -deleteসাথে এটি সংক্ষিপ্ত করা বৈধ হতে পারে তবে আমি যাচাই করি নি যে খালি খালি ডিরেক্টরিটি মুছবে না। -delete-depth-delete
অ্যাড্রিয়ান প্রানক

@ অ্যাড্রিয়ানপ্রোনক এটি করে না:find: cannot delete './foo': Directory not empty
টেরডন

28

আপনি unzip -lqq <filename.zip>জিপ ফাইলের বিষয়বস্তু তালিকাতে ব্যবহার করতে পারেন ; এর মধ্যে এমন কিছু বহিরাগত তথ্য অন্তর্ভুক্ত থাকবে যা আপনাকে ফিল্টার করতে হবে though এখানে একটি আদেশ রয়েছে যা আমার পক্ষে কাজ করে:

unzip -lqq file.zip | awk '{print $4;}' | xargs rm -rf

awkকমান্ডটি কেবল ফাইল এবং ডিরেক্টরিগুলির নাম বের করে। তারপরে ফলাফলটি xargsমুছে ফেলার জন্য পাস করা হয়। xargs rm -rfফলাফলটি সঠিক কিনা তা নিশ্চিত করার জন্য আমি প্রথমে কমান্ডের শুকনো রান (যেমন অংশটি বাদ দিয়ে ) করার পরামর্শ দিচ্ছি ।

উপরোক্ত কমান্ডটিতে পাথগুলিতে শ্বেত স্থান রয়েছে এমন বিষয়ে সমস্যা থাকবে। এই (আরও জটিল) সংস্করণে এটি ঠিক করা উচিত:

unzip -lqq file.zip | awk '{$1=$2=$3=""; sub(/ */, "", $0); printf "%s%s", $0, "\0"}' | xargs -0 rm -rf

এটি ইতিমধ্যে আমার মনে যা ছিল তার খুব কাছে, তবে unzip -lqqজিপটিতে থাকা ডিরেক্টরিগুলিও তালিকাভুক্ত করে। আপাতত আমি সমস্ত ডিরেক্টরি একা ছেড়ে দিতাম। কোনও গাছের সমস্ত খালি ডিরেক্টরি কীভাবে মুছবেন তা একটি ফলো-আপ প্রশ্ন হতে পারে।
mafp

@mafp ডিরেক্টরি সম্পর্কে এটি একটি ভাল পয়েন্ট। grep -v '/$'ডিরেক্টরি মুছে ফেলা এড়াতে আপনি পাইপলাইনে যুক্ত করতে পারেন (যার মধ্যে একটি পেছনের স্ল্যাশ রয়েছে, এএএএফসিটি)।
jjlin

@ এটারডন আসলে আমার মনে হয় সমস্যাটি শুরু হয় awk, যেহেতু মাত্র 4 ডলার মুদ্রণ পুরো পথটি মুদ্রণ করবে না।
jjlin

আমি মনে করি না যে আপনার -rআরএম বিকল্পটি ব্যবহার করা উচিত : এটি মনে হয় সমস্যাটির জন্য জিজ্ঞাসা করছে, বিশেষত -fবিকল্পটির সাথে মিলিত হওয়ার সময় । এই -fদৃশ্যে আমি বিকল্পটি ব্যবহার করব না ।
অ্যাড্রিয়ান প্রোঙ্ক

1
@jjlin: grep -v '/$'কেবল জিপ ফাইলে ডিরেক্টরি প্রবেশিকা বাদ দেবে। তারা এখনও এন্ট্রি অন্তর্ভুক্ত করবে যেগুলি জিপ ফাইলে সরল ফাইল ছিল তবে লক্ষ্য ফোল্ডারে পূর্ব বিদ্যমান ডিরেক্টরি ছিল। এই কারণে বাদ দেওয়া বুদ্ধিমানের কাজ হবে-r
অ্যাড্রিয়ান প্রানক

11

স্যুইচটি দিয়ে -Z1, আনজিপ প্রতি লাইনে ঠিক একটি ফাইল তালিকাবদ্ধ করবে (এবং অন্য কিছুই নয়)।

এইভাবে, আপনি ব্যবহার করতে পারেন

unzip -Z1 | xargs -I {} rm '{}'

জিপ ফাইল থেকে আহৃত সমস্ত ফাইল মুছতে to

আদেশ

unzip -Z1 | xargs -I {} rm -rf '{}'

ডিরেক্টরিগুলিও মুছে ফেলবে, তবে আপনাকে সতর্কতা অবলম্বন করতে হবে। জিপ ফাইলটি বের করার আগে যদি ডিরেক্টরিগুলি ইতিমধ্যে বিদ্যমান থাকে তবে সেই ডিরেক্টরিগুলির মধ্যে সমস্ত পূর্ব বিদ্যমান ফাইলগুলিও মুছে ফেলা হবে।


আপনি যদি যাইহোক জিপ ফাইলটি আবার বের করতে যাচ্ছেন তবে এমন আরও একটি উপায় রয়েছে যা অদ্ভুত ফাইলের নামগুলি মোকাবেলার জন্য গ্যারান্টিযুক্ত।

প্রথমে আপনি যে জিপ ফাইলটি এট্র্যাক্ট করতে চেয়েছিলেন তা প্রথমে বের করুন:

unzip file.zip -d elsewhere

এখন, ডিরেক্টরিতে পরিবর্তন করুন যেখানে আপনি ভুল করে ফাইলগুলি বের করেছেন এবং নিম্নলিখিত কমান্ডটি কার্যকর করুন:

find elsewhere -type f -printf "%P\0" | xargs -0 -I {} rm '{}'
  • -type f কেবল ফাইল (কোনও ডিরেক্টরি নেই) সন্ধান করে।

  • %P\0হ'ল আপেক্ষিক পথ (বিনা elsewhere/), একটি নাল অক্ষর দ্বারা অনুসরণ করা।

  • -0xargs নাল অক্ষর দ্বারা পৃথক লাইন তোলে। এটি আরও নির্ভরযোগ্য, যেহেতু - তত্ত্ব অনুসারে - ফাইলের নামগুলিতে নিউলাইন অক্ষর থাকতে পারে।


বাম দিকের ডিরেক্টরিগুলি মোকাবেলা করতে আপনি কমান্ডটি কার্যকর করতে পারেন:

find -type d -exec rmdir -p {} \; 2> /dev/null
  • -type d কেবল ডিরেক্টরি অনুসন্ধান করে।

  • -exec rmdir -p {} \;rmdir -p {}পাওয়া গেছে যে প্রতিটি ডিরেক্টরি জন্য এক্সিকিউট ।

    {}ডিরেক্টরিটি খুঁজে পাওয়া গেছে এবং -pস্যুইচটি rmdir এর খালি পিতামহ ডিরেক্টরিগুলিও সরিয়ে দেয়।

  • 2> /dev/null খালি বা পূর্বে মুছে ফেলা ডিরেক্টরি মুছে ফেলার চেষ্টা থেকে উদ্ভূত ত্রুটি বার্তাগুলি দমন করে।


সম্পর্কিত ম্যান পেজ:


আমাকে zipinfoম্যান পৃষ্ঠাটি পড়ার জন্য +1 করুন ।
টেরডন

আচ্ছা জি, এটিকে কিছুটা সহজ করে তোলে। :)
jjlin

2

এখানে একটি আরও সহজ এবং নিরাপদ (আমার মনে হয়) সমাধান রয়েছে

zip -m getmeoutofhere.zip `unzip -lqq myoriginalzipfile.zip`
rm getmeoutofhere.zip

এটি কী করছে: ব্যাককোয়েটেড আনজিপ কমান্ডটি আপনার মূল ফাইলটিতে কী ছিল তার একটি তালিকা তৈরি করবে will

জিপ-এম তারপরে সেই তালিকাটি যুক্ত করতে প্রতিটিটিকে getmeoutofhere.zip এ যোগ করতে এবং এটি মূল ডিরেক্টরি থেকে সরান (তাই তাত্ত্বিকভাবে এটি মায়রিগিনালফিল.জিপের ক্ষেত্রে অন্তরঙ্গ হওয়া উচিত।

Downside হয় যে আনজিপ -lqq কিছু অতিরিক্ত পাঠ্য, তারিখ, সময়, FILESIZE ইত্যাদি.এই জিপ -m ত্রুটি বার্তা উত্পাদন করতে হবে উত্পাদন করা হবে কিন্তু এই কোন প্রভাবিত থাকা উচিত (যদি না আপনি একই সাথে একটি ফাইলের অসম্ভাব্য কেস আছে নাম)।

দয়া করে নোট করুন যে এটি মূল আনজিপ করার সময় তৈরি হওয়া কোনও ডিরেক্টরি সরিয়ে ফেলবে না।


আকর্ষণীয় পদ্ধতির, আরও অন্বেষণ করা হবে।
mafp

1

আপনি যদি ফাইলগুলি নিষ্ক্রিয় করেন যে সংরক্ষণাগারটিতে সংশোধন টাইমস্ট্যাম্পটি নিষ্কাশিত অনুলিপিগুলিতে সংরক্ষণ করা হয় না (বরং উত্তোলিত ফাইলগুলির স্বাভাবিক পরিবর্তনের সময় রয়েছে) তবে এটি আক্রমণ করার সঠিক উপায়টি পরিবর্তন সময়ের মাধ্যমে is সমস্ত এক্সট্রাক্ট করা ফাইলের সেই ডিরেক্টরিতে সর্বাধিক সংশোধিত বিদ্যমান ফাইলের চেয়ে একটি নতুন পরিবর্তনের টাইমস্ট্যাম্প রয়েছে।

এখানে একটি সাধারণ পরিস্থিতি is

মনে করুন যে বর্তমান ডিরেক্টরিতে বিদ্যমান ফাইলগুলির কোনওরই কমপক্ষে 24 ঘন্টা ছোঁয়া হয়নি। গত 24 ঘন্টার মধ্যে যে কোনও কিছু সংশোধন করা হয়েছিল তা জিপফাইলে থেকে আবদ্ধ।

$ find . -mtime -1 -print0 | xargs -0 rm

এটি কিছু ডিরেক্টরিও খুঁজে পাবে, তবে rmসেগুলি একা রেখে দেবে। তাদের সাথে দ্বিতীয় পাসে মোকাবেলা করা যেতে পারে:

$ find . -mtime 1 -type d -print 0 | xargs -0 rmdir

সম্প্রতি যে কোনও ডিরেক্টরি যা সংশোধিত হয়েছিল সেগুলি জিপ দ্বারা সংশোধন করা হয়েছিল। যদি rmdirএগুলি সফলভাবে সরিয়ে দেয় তবে এর অর্থ তারা খালি। জিপ দ্বারা স্পর্শ করা খালি ডিরেক্টরিগুলি সম্ভবত এটি তৈরি করেছিল: যেমন আর্কাইভ থেকে এসেছে came আমরা ১০০% নিশ্চিত হতে পারি না। এটা সম্ভব যে আনজিপ কাজটি একটি বিদ্যমান ডিরেক্টরিতে কিছু ফাইল খালি ছিল।

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

# list directory in descending order of modification time
$ ls -1t > filelist  # descending order of modification time

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

:%s/.*/"&"/

তারপরে এগুলিকে একটি বড় লাইনে যুক্ত করুন:

:%j

এখন rm -rfএর সামনে inোকান:

Irm - rf<ESC>

শেল কমান্ড হিসাবে কার্সারের নীচে লাইনটি চালান:

!!sh<Enter>

অবশ্যই, আমি ইতিমধ্যে উপস্থিত ফাইলগুলি মুছে ফেলার ঝুঁকির কারণে বা ফাইলের নাম সম্পর্কিত সমস্যার কারণে এই কাজের পদক্ষেপগুলি স্বয়ংক্রিয় করব না।

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

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