বড় .tgz থেকে দক্ষতার সাথে ফাইল (গুলি) সরান


14

ধরুন আমার কাছে একটি জিপিপ সংক্ষেপিত টার-বল সংক্ষেপিত আর্কিভ.টিজিজেড (+100 ফাইল, মোট + 5 জিবি) রয়েছে।

প্রদত্ত ফাইলনামের সাথে ধরণের সমস্ত এন্ট্রি মুছে ফেলার দ্রুততম উপায় কী হবে উদাহরণস্বরূপ উপসর্গ * .jpg এর জন্য এবং তারপরে অবশিষ্টাংশটি আবার জিজিপ: এড টার-বলে সংরক্ষণ করুন?

পুরানো সংরক্ষণাগারটি প্রতিস্থাপন করা বা একটি নতুন তৈরি করা গুরুত্বপূর্ণ নয়, যেটি দ্রুত।


উত্তর:


14

জিএনইউ দিয়ে tarআপনি এটি করতে পারেন:

pigz -d < file.tgz |
  tar --delete --wildcards -f - '*/prefix*.jpg' |
  pigz > newfile.tgz

সাথে bsdtar:

pigz -d < file.tgz |
  bsdtar -cf - --exclude='*/prefix*.jpg' @- |
  pigz > newfile.tgz

( pigzএর বহু-থ্রেড সংস্করণ হচ্ছে gzip)।

আপনি নিজের মতো করে ফাইলটি ওভাররাইট করতে পারেন:

{ pigz -d < file.tgz |
    tar --delete --wildcards -f - '*/prefix*.jpg' |
    pigz &&
    perl -e 'truncate STDOUT, tell STDOUT'
} 1<> file.tgz

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


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

8

সহজ উপায়টি ছাড় করবেন না: এটি আপনার প্রয়োজনের জন্য দ্রুত পর্যাপ্ত হতে পারে। ডিরেক্টরি হিসাবে সংরক্ষণাগারটি অ্যাক্সেস করতে অ্যাফএফ সহ :

cd ~/.avfs/path/to/original.tar.gz\#
pax -w -s '/^.*\.jpg$//' | gzip >/path/to/filtered.tar.gz        # POSIX
tar -czf /path/to/filtered.tar.gz -s '/^.*\.jpg$//' .            # BSD
tar -czf /path/to/filtered.tar.gz --transform '/^.*\.jpg$//' .   # GNU

আরও আদিম সরঞ্জামের সাহায্যে প্রথমে ফাইলগুলি বাদ দিয়ে .jpgফাইলগুলি বের করুন , তারপরে একটি নতুন সংরক্ষণাগার তৈরি করুন।

mkdir tmpdir && cd tmpdir
<original.tar.gz gzip -d | pax -r -pe -s '/^.*\.jpg$//'
pax -w . | gzip >filtered.tar.gz
cd .. && rm -rf tmpdir

যদি আপনার টারে থাকে --exclude:

mkdir tmpdir && cd tmpdir
tar -xzf original.tar.gz --exclude='*.jpg'
tar -czf filtered.tar.gz .
cd .. && rm -rf tmpdir

আপনি যদি এটি রুট হিসাবে চালনা না করেন তবে এটি মঙ্গলে ফাইলের মালিকানা এবং মোডগুলি হতে পারে। সেরা ফলাফলের জন্য, দ্রুত ফাইল সিস্টেমের একটি অস্থায়ী ডিরেক্টরি ব্যবহার করুন - tmpfs যদি আপনার কাছে যথেষ্ট পরিমাণে বড় থাকে।

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

আপনি পাইথনের কয়েকটি লাইনে শক্তিশালী সংরক্ষণাগার ফিল্টার তৈরি করতে পারেন। এর tarfileগ্রন্থাগারটি অ-সন্ধানযোগ্য স্ট্রিমগুলি থেকে পড়তে বা লিখতে পারে এবং আপনি পাইথনে নির্বিচার কোড ব্যবহার করতে পারেন ফিল্টার, নামকরণ, পরিবর্তন করতে ...

#!/usr/bin/python
import re, sys, tarfile
source = tarfile.open(fileobj=sys.stdin, mode='r|*')
dest = tarfile.open(fileobj=sys.stdout, mode='w|gz')
for member in source:
    if not (member.isreg() and re.match(r'.*\.jpg\Z', member.name)):
        sys.stderr.write(member.name + '\n')
        dest.addfile(member, source.extractfile(member))
dest.close()

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

2

ম্যাক ওএসএক্স-এ আসা টারটির সাহায্যে আপনি এটি করতে পারেন:

tar -czf b.tgz --exclude '*.jpg' @a.tgz
mv b.tgz a.tgz

1

এটি করার জন্য, আপনাকে সম্ভবত একটি স্থানীয় ডিআর মধ্যে .tgz ফাইলের সমস্ত সন্তোষজনক ফাইলটি বের করতে হবে এবং তারপরে যে ফাইলগুলি আপনি চান না তা মুছুন এবং তারপর .tgz পুনরায় সংযোগ করুন।

এটি দীর্ঘ এবং আপনার পর্যাপ্ত ফ্রি ডিস্ক স্পেস প্রয়োজন তবে আমার সেরা জ্ঞানের পক্ষে এটি করার অন্য কোনও উপায় নেই।

প্রদত্ত যে আপনার ইতিমধ্যে এমন কিছু পথ রয়েছে /tmpdir/withalotofspaceযার মতো পর্যাপ্ত ফাঁকা জায়গা রয়েছে (এটি ব্যবহার করে দেখুন df -h /tmpdir/withalotofspace), আপনি এর মতো কিছু করতে পারেন:

$ cd /tmpdir/withalotofspace
$ tar -xvfz /path/to/compressedArchive.tgz
$ find /tmpdir/withalotofspace/ -type f -iname '*.jpg' -delete
$ tar -cvzf /path/to/purgedcompressedArchive.tgz .

অন্যান্য উত্তরগুলি যেমন দেখায়,
পাইপিংয়ের

0

আমি উত্তরটি @ গিলস দ্বারা পছন্দ করি, এটি আরও সহজ করার জন্য বাদে। আনজিপ করার পরে, উদাহরণস্বরূপ gunzip foo.tgzফাইলটি হবে foo.tarএবং ফাইলগুলি দিয়ে মুছে ফেলা যাবে tar -f foo.tar --delete file|directory। নীচে একটি টার ফাইল থেকে ডিরেক্টরি সরানোর উদাহরণ।

    phablet@ubuntu-phablet:~/Downloads$ tar -cvf moo.tar moo1/
    moo1/
    moo1/moo2/
    moo1/moo2/moo3/
    moo1/moo2/moo3/moo4/
    moo1/moo2/moo3/moo4/moo5/
    phablet@ubuntu-phablet:~/Downloads$ tar -tf moo.tar 
    moo1/
    moo1/moo2/
    moo1/moo2/moo3/
    moo1/moo2/moo3/moo4/
    moo1/moo2/moo3/moo4/moo5/
    phablet@ubuntu-phablet:~/Downloads$ tar -f moo.tar --delete "moo1/moo2/moo3"
    phablet@ubuntu-phablet:~/Downloads$ tar -tf moo.tar 
    moo1/
    moo1/moo2/

নির্দিষ্ট ফাইল প্রকারের সাথে পাওয়া যাবে tar -tf foo.tar|egrep -i '.jpg$'

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