টার ফাইল ফাইল নিষ্কাশন জালিয়াতি পূর্বাবস্থায় ফেরান


34

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

user@comp:~/tidy$ tar xvf myarchive.tar
file1
file2
dir1/
dir1/file1
dir1/subdir1/
dir1/subdir1/file1
dir2/
dir2/file1
...

আমি আশা করছিলাম যে টার ফাইলটি একটি একক ফোল্ডারে (যেমন, myarchive/) সংগঠিত হত , তবে এটি ছিল না! এখন আমার কাছে প্রায় 190 টি ফাইল এবং ডিরেক্টরি রয়েছে যা ডিজিটালভাবে একটি সংযুক্ত ডিরেক্টরি ছিল তার মধ্যে বারফিড। এই অনর্থযুক্ত ফাইলগুলি পরিষ্কার করা দরকার।

এই সংরক্ষণাগার থেকে নেওয়া ফাইল এবং ডিরেক্টরিগুলি "মুছে ফেলা" এবং মুছে ফেলার কোনও উপায় আছে কি?


নীচের দুর্দান্ত উত্তরের জন্য ধন্যবাদ। সংক্ষেপে , এখানে দুটি পদক্ষেপ (1) ফাইলগুলি মুছুন এবং (2) বিপরীত প্যাকিং ক্রমে খালি ডিরেক্টরি কাঠামো মুছুন (প্রথমে বাইরের ডিরেক্টরিগুলি মোছার জন্য) যা কাজ করে তা এখানে:

tar tf myarchive.tar | xargs -d'\n' rm
tar tf myarchive.tar | tac | xargs -d'\n' rmdir

এবং আরও নিরাপদ, echoপরে যুক্ত করে কমান্ডগুলির একটি শুকনো রান প্রিভিউ করতে xargs


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

ভাগ্যক্রমে, কিছুই ওভাররাইট করা হয়নি!
মাইক টি

আমি এই প্রতিনিধিটির পরে নেই এবং আমি ভয় করছি যে আমি এটি যেভাবেই রাখি না কেন আমি বেদিকী শব্দ করব, যা আমি নই (আমি স্লহকের উত্তরও পছন্দ করেছি এবং আমি +1: এটি সম্পাদনা করেছি এবং সত্যই: rep 15 রেপ না আমার দুনিয়া), কিন্তু আপনি পাইপ দিয়ে আমার প্রস্তাব উত্তর ব্যবহার শেষ এবং xargs( tacপরিবর্তে sort -rশুধু প্রসাধনী), কিন্তু আপনি প্রক্রিয়া প্রতিকল্পন যে, আপনি মন্তব্য ব্যাখ্যা, আপনি উপযুক্ত নয় সঙ্গে উত্তর স্বীকার করবেন? এছাড়াও, দয়া করে xargs -d'\n'আপনি যদি ভবিষ্যতের ব্যবহারকারীদের সংক্ষিপ্তসার করতে চান তবে আপনার পোস্টে স্যুইচ দিন, যাতে তারা ফাইলের নামের ফাঁকে দংশন করবে না।
ড্যানিয়েল অ্যান্ডারসন

@ ড্যানিয়েল অ্যান্ডারসন, আমি -d'\n'এখন অবধি প্রয়োজনীয়তা কখনই বুঝতে পারি নি এবং আরও বিশ্লেষণের পরে আপনার উত্তরটি আসলে আমি যা ব্যবহার করেছি তার কাছাকাছি।
মাইক টি

ড্যানিয়েলের সমাধানটি খুব পছন্দ করেছে :) মিথ্যাটির প্রয়োজনীয়তা -d'\n'এই সত্য যে আপনি যদি xargsনতুন লাইনে যুক্তিগুলি (যেটি আপনি খাওয়াচ্ছেন) তবে ফাঁকা স্থানগুলিতে বিভক্ত করতে না বললে মিথ্যাটির প্রয়োজনীয়তা সত্য হয় তবে তার সাথে একটি ফাইল নাম folder1/some fileহিসাবে folder1/someএবং পড়া হবে name
স্ল্যাচ

উত্তর:


36
tar tf archive.tar

লাইন দ্বারা বিষয়বস্তু লাইন তালিকাবদ্ধ করবে।

এটি xargsসরাসরি পাইপ করা যেতে পারে তবে সাবধান থাকুন : মুছে ফেলা খুব সাবধানে করুন। আপনি কেবল যা কিছু বলেন তা আপনি করতে চান না , কারণ এটিতে ডিরেক্টরিগুলি অন্তর্ভুক্ত থাকতে পারে যা আনপ্যাক করার আগে খালি ছিল না!rm -rtar tf

আপনি করতে পারেন

tar tf archive.tar | xargs -d'\n' rm -v
tar tf archive.tar | sort -r | xargs -d'\n' rmdir -v

সংরক্ষণাগারে থাকা সমস্ত ফাইল প্রথমে এবং তারপরে ডিরেক্টরিগুলি খালি রেখে দিতে হবে।

sort -r(গ্লেনজ্যাকম্যান গৃহীত উত্তরের মন্তব্যে tacপরিবর্তে প্রস্তাবিত sort -r, যা tarআউটপুট পর্যাপ্ত নিয়মিত হওয়ায় এটিও কাজ করে ) প্রথমে গভীর ডিরেক্টরিগুলি মুছতে প্রয়োজন; অন্যথায় এমন একটি ক্ষেত্রে যেখানে dir1একটি একক খালি ডিরেক্টরি রয়েছে তা পাসের পরে dir2চলে যাবে , কারণ এটি অপসারণের আগে এটি খালি ছিল নাdir1rmdirdir2

এটি প্রচুর উত্পন্ন করবে

rm: cannot remove `dir/': Is a directory

এবং

rmdir: failed to remove `dir/': Directory not empty
rmdir: failed to remove `file': Not a directory

2>/dev/nullএটি আপনাকে বিরক্ত করে থাকলে এটিকে বন্ধ করুন , তবে আমি যতটা সম্ভব প্রক্রিয়া সম্পর্কে বেশি তথ্য রাখা পছন্দ করি।

আপনি যতক্ষণ না সঠিক ফাইলের সাথে মেলে তা নিশ্চিত না হওয়া পর্যন্ত এটি করবেন না। এবং সম্ভবত rm -iসবকিছু নিশ্চিত করার চেষ্টা করুন। এবং ব্যাকআপ রাখুন, আপনার প্রাতঃরাশ খাবেন, দাঁত ব্রাশ করুন ইত্যাদি


হ্যাঁ, -d'\n'বিকল্পটি পাস করা ভাল xargs
স্টাফেন গিমেনেজ

@ স্লহ্যাক এবং স্টাফেন: আহ, হ্যাঁ, আমি আপডেট করব। আমি কেবল একটি ছোট পরীক্ষার মামলা করেছি, তবে ফাইলগুলির কোনও স্থান নেই s
ড্যানিয়েল অ্যান্ডারসন

1
বিএসডির xargsকোনও উল্লেখ নেই -d, সুতরাং আপনার মতো জিএনইউ ভেরিয়েন্টের দরকার যদি আপনি আমার মতো দুর্বল হন।
slhck

10

তার মতো ট্যারি ফাইলের বিষয়বস্তু তালিকাভুক্ত করুন:

tar tzf myarchive.tar

তারপরে, সেই তালিকাটি পুনরাবৃত্তি করে সেই ফাইলগুলির নাম মুছুন:

while IFS= read -r file; do echo "$file"; done < <(tar tzf myarchive.tar.gz)

এটি এখনও মুছে ফেলা হবে এমন ফাইলগুলি তালিকাভুক্ত করবে। আপনি যদি মুছে ফেলার বিষয়ে সত্যই নিশ্চিত echoহন rmতবে এর সাথে প্রতিস্থাপন করুন । এবং নিশ্চিত হতে একটি ব্যাকআপ করুন।

দ্বিতীয় পাসে, যে ডিরেক্টরিগুলি অবশিষ্ট রয়েছে তা সরিয়ে ফেলুন:

while IFS= read -r file; do rmdir "$file"; done < <(tar tzf myarchive.tar.gz)

এটি ডিরেক্টরিগুলি ইতিমধ্যে উপস্থিত থাকলে মুছে ফেলা থেকে বাধা দেয়।


@Glennjackman এর আরও একটি দুর্দান্ত কৌশল, যা গভীরতম থেকে শুরু করে ফাইলগুলির ক্রম সংরক্ষণ করে। আবার echoহয়ে গেলে অপসারণ করুন ।

tar tvf myarchive.tar | tac | xargs -d'\n' echo rm

এটির পরে সাধারণ rmdirপরিচ্ছন্নতা অনুসরণ করা যেতে পারে ।


পাইপ লেখার অদ্ভুত উপায়।
স্টাফেন গিমেনেজ

এটা না একটি নল। এটি প্রক্রিয়া প্রতিস্থাপন এবং whileরেকর্ডের একটি সেট লুপের সাথে সংমিশ্রণে ব্যবহৃত হলে আমি সাধারণ পাইপিংয়ের চেয়ে বেশি পছন্দ করি । সবে অভ্যস্ত হয়ে গেল @ sté
slhck

1
কিছুটা বিলম্বের জন্য দুঃখিত, আমি লক্ষ্য করেছি যে rm -rfসংরক্ষণাগারভুক্ত নয় এমন একটি ডিরেক্টরিতে যা সংরক্ষণাগার থেকে একই নাম রয়েছে এমন একটি ডিরেক্টরিতে ফাইল মুছে ফেলতে পারে। এখানে ভাল সাবধান এবং rmdirদ্বিতীয় পাস ব্যবহার করুন ।
স্টাফেন গিমেনেজ

1
প্রকৃতপক্ষে দ্বিতীয় পাসটি rmdirডিরেক্টরিগুলির নেস্টিংয়ের প্রতিটি স্তরের জন্য চালানো দরকার। সুতরাং এটি subdir1প্রথম পাসে পরিষ্কার হয়ে যাবে , তবে ছেড়ে দিন dir1কারণ এটি যখন খালি ছিল না তখন এটি প্রথম মুছে ফেলার চেষ্টা করেছিল। এই তালিকাটি একবার করা যেতে পারে যদি ফাইল তালিকাটি বিপরীতভাবে সাজানো যায়।
মাইক টি

3
যদি আপনি বিপরীত ক্রমে মুছতে চান: tar tvf arch.tar | tac | xargs echo rm(আপনি যখন আত্মবিশ্বাসের সাথে প্রতিধ্বনিটি সরিয়ে ফেলুন)
গ্লেন জ্যাকম্যান

2

এখানে এমন একটি সম্ভাবনা রয়েছে যা আপনার মুখ্য ফোল্ডারটি সাফ করে ফেলা ফাইলগুলি নিয়ে যাবে এবং এগুলি একটি সাব-ডিরেক্টরিতে স্থানান্তরিত করবে।

    #!/usr/bin/perl -w

    use strict;
    use Getopt::Long;

    my $clean_folder = "clean";
    my $DRY_RUN;
    die "Usage: $0 [--dry] [--clean=dir-name]\n"
        if ( !GetOptions("dry!" => \$DRY_RUN,
                         "clean=s" => \$clean_folder));

    # Protect the 'clean_folder' string from shell substitution
    $clean_folder =~ s/'/'\\''/g;

    # Process the "tar tv" listing and output a shell script.
    print "#!/bin/sh\n" if ( !$DRY_RUN );
    while (<>)
    {
        chomp;

        # Strip out permissions string and the directory entry from the 'tar' list
        my $perms = substr($_, 0, 10);
        my $dirent = substr($_, 48);

        # Drop entries that are in subdirectories
        next if ( $dirent =~ m:/.: );

        # If we're in "dry run" mode, just list the permissions and the directory
        # entries.
        #
        if ( $DRY_RUN )
        {
            print "$perms|$dirent\n";
            next;
        }

        # Emit the shell code to clean up the folder
        $dirent =~ s/'/'\\''/g;
        print "mv -i '$dirent' '$clean_folder'/.\n";
    }

এটি ফাইলে সংরক্ষণ করুন fix-tar.plএবং তারপরে এটি কার্যকর করুন:

$ tar tvf myarchive.tar | perl fix-tar.pl --dry

এটি নিশ্চিত করবে যে আপনার tarতালিকাটি আমার মতো। আপনি যেমন আউটপুট পেতে হবে:

-rw-rw-r--|batch
-rw-rw-r--|book-report.png
-rwx------|CaseReports.png
-rw-rw-r--|caseTree.png
-rw-rw-r--|tree.png
drwxrwxr-x|sample/

যদি এটি দেখতে ভাল লাগে, তবে আবার এটি চালান:

$ mkdir cleanup
$ tar tvf myarchive.tar | perl fix-tar.pl --clean=cleanup > fixup.sh

fixup.sh(এই ইনস্ট্যান্সের মধ্যে, ফোল্ডার নামক স্ক্রিপ্ট শেল কমান্ড করে একটি "পরিষ্কার" ফোল্ডারের মধ্যে টপ লেভেল ফাইল ও ডিরেক্টরিগুলি সরাতে হবে cleanup)। এটি সমস্ত কোশার তা নিশ্চিত করার জন্য এই স্ক্রিপ্টটির মাধ্যমে একটি তদন্ত করুন। যদি এটি হয় তবে আপনি এখন এই দিয়ে আপনার জগাখিচুড়ি পরিষ্কার করতে পারেন:

$ sh fixup.sh

আমি এই ধরণের ক্লিনআপ পছন্দ করি কারণ এটি এমন কোনও কিছু ধ্বংস করে না যা সেই প্রাথমিক দ্বারা ওভাররাইট করে ইতিমধ্যে ধ্বংস হয় না tar xv

দ্রষ্টব্য: যদি সেই প্রাথমিক শুকনো রান আউটপুট সঠিক না দেখায় তবে দুটি substrফাংশন কলগুলিতে যথাযথ চেহারা না পাওয়া পর্যন্ত আপনি তাদের সাথে ফিডল করতে সক্ষম হবেন । $permsপরিবর্তনশীল শুধুমাত্র চালানো সত্যিই তাই শুধুমাত্র শুষ্ক জন্য ব্যবহার করা হয় $direntসাবস্ট্রিং চাহিদা সঠিক হতে হবে।

অন্য একটি জিনিস: তালিকার মধ্যে ব্যবহারকারীর নাম এবং / অথবা গ্রুপের নামগুলি একটি অনির্দেশ্য কলামে নামগুলি শুরু করা হলে আপনাকে tarবিকল্পটি ব্যবহার করতে হতে পারে ।--numeric-ownertar


1

এই জাতীয় (অসামাজিক) সংরক্ষণাগারটি তার কাজগুলির কারণে টার বোমা বলে। এইগুলির মধ্যে একটি "আপনার" বিস্ফোরিত হয়ে গেলে, অন্যান্য উত্তরের সমাধানগুলি আমার পরামর্শের চেয়ে আরও ভাল।

সর্বোত্তম "সমাধান", তবে প্রথমে সমস্যাটি রোধ করা।

এটি করার সবচেয়ে সহজ (অলস) উপায় হ'ল সর্বদা একটি খালি ডিরেক্টরিতে একটি সংরক্ষণাগারটি আনপ্যাক করা। যদি এটি একটি শীর্ষ স্তরের ডিরেক্টরি অন্তর্ভুক্ত করে, তবে আপনি কেবল এটি পছন্দসই গন্তব্যে নিয়ে যান। যদি তা না হয় তবে কেবলমাত্র আপনার কার্যকরী ডিরেক্টরিটির নাম পরিবর্তন করুন (যা খালি ছিল) এবং এটি পছন্দসই জায়গায় নিয়ে যান move

আপনি যদি ঠিক এটি প্রথমবার পেতে চান তবে আপনি tar -tvf সংরক্ষণাগার-file.tar | চালাতে পারেন কম এবং এটি সংরক্ষণাগারের বিষয়বস্তু তালিকাভুক্ত করবে যাতে আপনি এটি কীভাবে কাঠামোবদ্ধ তা দেখতে পারেন এবং তারপরে এটি শুরু করার জন্য পছন্দসই স্থানে বের করার জন্য প্রয়োজনীয় যা করতে পারেন তা করতে পারেন।

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

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