কীভাবে ডি-আনজিপ করবেন, ডি-টার-এক্সভিএফ - অগোছালো ফোল্ডারে ডি-আর্কাইভ করবেন?


14

সাধারণত, আমি জিনিসগুলি সংরক্ষণাগারভুক্ত করি $ mkdir newFolder; $ mv *.zip newFolder; $ cd newFolder; $unzip *.zipতবে মাঝে মাঝে আমি অলসতা পাই এবং কেবল একটি স্বেচ্ছাসেবী ফোল্ডারে করি $ unzip *.zipতাই সময়-সময় অন্য সামগ্রীগুলির সাথে জড়িয়ে যায়। আমি এখানে কয়েকটি পদ্ধতি তালিকাভুক্ত করব - কিছু সংরক্ষণাগার সংস্করণে অবশ্যই ক্রেডি-ফ্ল্যাগ থাকবে অন্যরা আরও স্পার্টান, আমি পরবর্তীগুলির সম্পর্কে আরও আগ্রহী।

অ-সংরক্ষণাগারবদ্ধ করার কিছু উপায় আছে, অন্য কি আছে?

  1. $ find . -anewer fileThatExistedBeforeUnarchieving -ok rm '{}' \;দুর্বলতাগুলি *.zipহ'ল এটি মজাদারদের তালিকাভুক্ত করে , তাই আপনাকে -okঅনেক *.zipম্যাচের সাথে ধীর এবং ধীর গতির ব্যবহার করতে হবে এবং কোনও কারণে এটি তোলা সমস্ত কিছুর সাথে মিলছে বলে মনে হয় না।

  2. যদি অল্প পরিমাণে এক্সট্রাক্ট করা ফাইল হয় তবে একের পর এক ধীর, জটিল এবং ত্রুটি-প্রবণ।

  3. আমি যখন $ unzip -l *.bsdআর্কাইভের সামগ্রীটি কোনও ফোল্ডার কিনা তা নিশ্চিত করতে চাই, আমি মাঝে মাঝে এটি যাচাই করে দেখি , কমপক্ষে অবসেস-এর আনজিপ-সংস্করণে কাজ করে।

আপনি যদি কিছু সংরক্ষণাগার সরঞ্জামের উল্লেখ করছেন, দয়া করে, উপযুক্ত হলে সেগুলি জানান। যদিও এটি সহজ রাখুন - আপনি একক সরঞ্জামের চেয়ে আপনি কীভাবে এটি করেন সে সম্পর্কে আমি বেশি আগ্রহী।



mkdir; unzipজিনিসগুলি স্বয়ংক্রিয় করতে আমি এখানে ব্যবহার করি এমন একটি স্ক্রিপ্ট যাতে আমি কখনও এটি করতে খুব বেশি অলস হই না! svn.mikelward.com/svn/scriptts/untar
মাইকেল

2
এই সম্পর্কিত প্রশ্নোত্তর দেখুন: unix.stackexchange.com/questions/5123/…
অ্যালেক্স

উত্তর:


11

নামে

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

tar tf foo.tar | while read -r file; do rm -- "$file" done
unzip -l foo.zip | awk '
    p && /^ --/ {p=2}
    p==1 {print substr($0, 29)}
    /^ --/ {++p}
' | while …
unzip -l foo.zip | tail -n +4 | head -n -2 | while …  # GNU coreutils only
7z l -slt foo.zip | sed -n 's/^Path = //p' | while …  # works on tar.*, zip, 7z and more

ফাইলগুলি অপসারণের পরিবর্তে আপনি এগুলিকে তাদের পছন্দসই গন্তব্যে নিয়ে যেতে পারেন।

tar tf foo.tar | while read -r file; do
  if [ -d "$file" ]; then continue; fi
  mkdir -p "/intended/destination/${file%/*}"
  mv -- "$file" "/intended/destination/$file"
done

FUSE ব্যবহার করে

বাহ্যিক সরঞ্জামগুলির উপর নির্ভর করে পরিবর্তে, আপনি (বেশিরভাগ সংযোগে) সাধারণ ফাইল সিস্টেম কমান্ড ব্যবহার করে সংরক্ষণাগারগুলি পরিচালনা করতে FUSE ব্যবহার করতে পারেন ।

আপনি জিপটিতে উঁকি দেওয়ার জন্য এটি ফিউজ-জিপ ব্যবহার করতে পারেন , এটি দিয়ে উত্তোলন করতে পারেন cp, এর সামগ্রীগুলি এর সাথে তালিকাবদ্ধ করতে পারেন findইত্যাদি can

mkdir /tmp/foo.d
fuse-zip foo.zip /tmp/foo.d
## Remove the files that were extracted mistakenly (GNU/BSD find)
(cd /tmp/foo.d && find . \! -type d -print0) | xargs -0 rm
## Remove the files that were extracted mistakenly (zsh)
rm /tmp/foo.d/**(:"s~/tmp/foo.d/~~"^/)
## Extract the contents where you really want them
cp -Rp /tmp/foo.d /intended/destination
fusermount -u foo.d
rmdir foo.d

এভিএফএস আপনার সম্পূর্ণ ডিরেক্টরি হায়ারার্কির একটি দৃশ্য তৈরি করে যেখানে সমস্ত সংরক্ষণাগারটিতে একটি সম্পর্কিত ডিরেক্টরি রয়েছে (শেষের দিকে # টি দিয়ে একই নাম) যা সংরক্ষণাগার সামগ্রীটি উপস্থিত রয়েছে বলে মনে হয়।

mountavfs
## Remove the files that were extracted mistakenly (GNU/BSD find)
(cd ~/.avfs/"$PWD/foo.zip#" && find . \! -type d -print0) | xargs -0 rm
## Remove the files that were extracted mistakenly (zsh)
rm ~/.avfs/$PWD/foo.zip\#/**/*(:"s~$HOME/.avfs/$PWD/foo.zip#~~"^/)
## Extract the contents where you really want them
cp -Rp ~/.avfs/"$PWD/foo.zip#" /intended/destination
umountavfs

তারিখ অনুসারে

ধরে নিই যে আপনার উত্তোলনের চেয়ে একই শ্রেণিবিন্যাসে অন্য কোনও ক্রিয়াকলাপ হয়নি, আপনি তাদের সাম্প্রতিক সিটিটাইমে এক্সট্রাক্ট করা ফাইলগুলি বলতে পারেন । আপনি যদি সবেমাত্র জিপ ফাইলটি তৈরি বা সরিয়ে নিয়ে থাকেন তবে আপনি এটিকে একটি কাট অফ হিসাবে ব্যবহার করতে পারেন; অন্যথায় ls -lctrউপযুক্ত কাটঅফ সময় নির্ধারণ করতে ব্যবহার করুন । আপনি যদি জিপগুলি সরিয়ে না ফেলে তা নিশ্চিত করতে চান তবে কোনও ম্যানুয়াল অনুমোদনের কোনও কারণ নেই: findএগুলি বাদ দেওয়ার পক্ষে পুরোপুরি সক্ষম। এখানে zsh ব্যবহার করে বা কম্যান্ডের উদাহরণ রয়েছে find; নোট করুন যে -cminএবং -cnewerপ্রাইমারিগুলি পসিক্সে নেই তবে লিনাক্সে উপস্থিত রয়েছে (এবং জিএনইউ খুঁজে পাওয়া অন্যান্য সিস্টেমগুলি), * বিএসডি এবং ওএসএক্স।

find . \! -name '*.zip' -type f -cmin -5 -exec rm {} +  # extracted <5 min ago
rm **/*~*.zip(.cm-6)  # zsh, extracted ≤5 min ago
find . -type f -cnewer foo.zip -exec rm {} +  # created or moved after foo.zip

জিএনইউ ফাইন্ড, ফ্রিবিএসডি এবং ওএসএক্সের সাহায্যে, কাটফট সময় নির্দিষ্ট করার অন্য একটি উপায় হ'ল একটি ফাইল তৈরি করা এবং touchতার এমটাইমটিকে কাট অফের সাথে সেট করার জন্য ব্যবহার করা।

touch -d … cutoff
find . -type f -newercm cutoff -delete

ফাইলগুলি অপসারণের পরিবর্তে আপনি এগুলিকে তাদের পছন্দসই গন্তব্যে নিয়ে যেতে পারেন। GNU / * BSD / OSX সন্ধানের একটি উপায় এখানে রয়েছে, প্রয়োজন অনুসারে গন্তব্যে ডিরেক্টরি তৈরি করে।

find . \! -name . -cmin -5 -type f -exec sh -c '
    for x; do
      mkdir -p "$0/${x%/*}"
      mv "$x" "$0/$x"
    done
  ' /intended/destination {} +

জেডএস সমতুল্য (প্রায়: এটি একটি সম্পূর্ণ ডিরেক্টরি হায়ারার্কির পুনরুত্পাদন করে, কেবল যে ডিরেক্টরিগুলিতে ফাইল থাকবে):

autoload zmv
mkdir -p ./**/*(/cm-3:s"|.|/intended/destination|")
zmv -Q '(**/)(*)(.cm-3)' /intended/destination/'$1$2'

সতর্কতা, আমি এই উত্তরের বেশিরভাগ কমান্ড পরীক্ষা করে দেখিনি। অপসারণের আগে সর্বদা ফাইলগুলির তালিকা পর্যালোচনা করুন ( echoপ্রথমে রান করুন , তারপরে rmএটি ঠিক আছে তবে)।


আমি অবশেষে আজ এই সমস্যায় পড়েছি। মূল হিসাবে! শেষ পর্যন্ত আমি "নাম দ্বারা" এবং "তারিখ অনুসারে" এর সংমিশ্রণটি ব্যবহার করেছি
ফুনেহে

1

আমি বোকা বোধ করছি, যাইহোক যাইহোক এই জাতীয় স্ক্রিপ্টটি লেখার জন্য আমি আমার মাথা আঁচড়ান যখন আমার একই রকম সমস্যা ছিল। আমি ব্যবহৃত cpioসঙ্গে -itফাইলগুলির একটি তালিকা পেতে পতাকা; আপনি অন্য সংরক্ষণাগারগুলির জন্য সমতুল্য আদেশগুলি ব্যবহার করতে পারেন। জটিল অংশটি হ'ল, সিপিও আর্কাইভটি একটি আরআরআরডি থেকে এবং আমি এতে সঞ্চারিত করেছি /, তাই অনেকগুলি ফোল্ডার এবং ফাইলগুলির একটি নাম যেমন একটি ওয়ার্কিং সিস্টেমের মতো থাকে। ভাগ্যক্রমে সিপিও আমার বিদ্যমান ফাইলগুলির কোনও ওভাররাইট করতে পারেনি। আমি ভুল কমান্ডের পূর্বে বিদ্যমান যে কোনও কিছু মুছে ফেলতে না পারে তা নিশ্চিত করার জন্য একটি টাইম চেক ব্যবহার করি।

#! /bin/sh

files=$(cpio -it < /mnt/temp/lglive.cpio)

for i in ${files}
do
    name=$(stat -c "%n" ${i})
    time=$(stat -c "%Y" ${i})
    # Time of the creation of the mess: 1296457595
    if [[ ${time} -gt 1296457590 && ${time} -lt 1296457600 ]]
    then
        if [[ -f ${name} ]]
        # If it is a file, it must have been created as part of the mess.
        then
            echo "rm ${name}"
        elif [[ -d ${name} ]]
        # If it is a directory, it may have been part of the mess
        # or maybe some files underneath it is created as part of the mess.
        then
            if [[ $(ls -A ${name}) ]]
            # If the directory contains something then don't delete it.
            then
                echo "${name} is not empty"
            # If the directory is empty then assume it is rubbish.
            else
                echo "rmdir ${name}"
            fi
        fi
    fi
done

echo "Files and directories still exist after the removal:"
for i in ${files}
do
    if [[ -e ${i} ]]
    then
        echo ${i}
    fi
done

0

সংরক্ষণাগারে ফাইলগুলির তালিকা খাওয়ানো সম্পর্কে কীভাবে xargs rm?

এটা হবে tar -tf tarbomb.tar | xargs rmবা unzip --list zipbomb.zip | xargs rm


2
প্রদত্ত কমান্ডগুলি সাধারণ ক্ষেত্রে কার্যকর হবে না এবং এটি ফাইল বিপজ্জনক যেহেতু এটি বিপজ্জনকxargsআশা findকরে না যে এর ইনপুটটি অদ্ভুত উপায়ে উদ্ধৃত হয়েছে যা উত্পাদন করে না। ব্যবহার করুন xargs -I rm {}যাতে xargs পরিবর্তে প্রতি লাইনে একটি আইটেম প্রক্রিয়া করে। আনজিপ কমান্ডের জন্য, আপনার কী প্রয়োগ রয়েছে? মাইনের (ডেবিয়ান / উবুন্টু) --listকেবল নেই -l, এবং এটি কেবল ফাইলের নাম মুদ্রণ করে না, যাতে অতিরিক্ত প্রক্রিয়াজাতকরণ প্রয়োজন।
গিলস

@ গিলস: ১) হ্যাঁ, এটি বিপজ্জনক, তবে যেহেতু আমরা সম্ভবত মূল ফাইলগুলি ওভাররাইট করেছি - সেগুলি ইতিমধ্যে চলে গেছে। 2) আমি কথা বলছিলাম না find। 3) আপনি সম্পর্কে সঠিক unzip, আমি পরীক্ষা করিনি এবং অজস্র তালিকাবদ্ধ হওয়ার কোনও বিকল্প নেই বলে মনে হচ্ছে। --listআমার উবুন্টুতেও নেই - আমি কেবল পরীক্ষা করিনি।
অ্যালেক্স

ক্যানড প্রতিক্রিয়া tar -tজন্য দুঃখিত, বিকল্প find। তবে আমার অন্যান্য বিষয় দাঁড়িয়ে আছে। প্রকৃত ঝুঁকি রয়েছে যে প্রদত্ত হিসাবে আপনার আদেশটি কোনও সম্পর্কযুক্ত ফাইল মুছে ফেলবে।
গিলস 'খারাপ হয়ে যাওয়া বন্ধ করুন'

tar -tf tarbomb.tarপ্রতি লাইনে ফাইলের নাম মুদ্রণ করবে, যাতে আপনি এটি করতে tar -tf tarbomb.tar | while IFS=$'\n' read -r filename; do rm "$filename"; doneবা অনুরূপ করতে পারেন ।
মাইকেল

0

আপনি যা চেয়েছিলেন তা আসলে নয় তবে কীভাবে পরিবর্তে "সমস্ত আনজিপ করুন" স্ক্রিপ্টটি ব্যবহার করবেন।

unzip *.zip

প্রতিটি ফাইল থেকে আউটপুট তার নিজস্ব ডিরেক্টরিতে যায়।

#!/bin/bash
for f in *.zip ; do unzip -n "$f" -d "${f/%zip/out}"; done

0

আমি zsh এ নিম্নলিখিত ফাংশনটি ব্যবহার করি:

ununzip () {
    rm -r $(unzip -l $1 | grep -v 'Archive:' | \
    grep '[/.]' | sed 's![^a-zA-Z]([a-zA-Z./])!\1!')
}

অর্থনীতির ক্লিন আপ আউটপুটে সমস্ত ফাইল সরানোর জন্য কমান্ড প্রতিস্থাপন unzip -l

tar tvf একইভাবে ব্যবহার করা যেতে পারে।

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