একটি ফোল্ডারে অন্তর্ভুক্ত .gz ফাইলের নিষ্কাশন


13

আমার কাছে প্রায় 320116 .pdb.gz ফাইল সমন্বিত একটি ফোল্ডার রয়েছে। আমি তাদের সব সঙ্কুচিত করতে চাই। আমি যদি গানজিপ * .জিজেড ব্যবহার করি তবে এটি আমাকে একটি ত্রুটি দেয় যেমন আর্গুমেন্টের তালিকা অনেক দীর্ঘ। ফোল্ডারটি প্রায় 2 জিবি। দয়া করে আমাকে একটি উপযুক্ত পরামর্শ দিন।


যদি আপনাকে দীর্ঘমেয়াদে এই ডিরেক্টরি কাঠামোয় কাজ করতে হয় তবে এই ডিরেক্টরিটি অনেকগুলিতে বিভক্ত করুন। উদাহরণস্বরূপ ফাইলগুলির পরিবর্তনের সময় বা ফাইলের নামের উপর ভিত্তি করে।
ডান

হ্যাঁ আমাকে দীর্ঘ মেয়াদে কাজ করতে হবে। তাদের এখন সরানো হয়েছে আমি তাদের নামের ভিত্তিতে এটিকে তিনটি ফোল্ডারে উপ-বিভাগ ও শ্রেণীবদ্ধ করতে চাই। এটি করার জন্য কি কোনও শেল স্ক্রিপ্ট আছে?
লিলি শার্পটন

আমি আপনাকে সেখানে অনুরূপ প্রশ্নগুলির জন্য অনুসন্ধান করার পরামর্শ দিচ্ছি। আপনি যদি নিজের প্রয়োজন অনুসারে কোনওটি না পান তবে নিজের নতুন প্রশ্ন জিজ্ঞাসা করুন।
ডান

উত্তর:


25
find . -name '*.pdb.gz' -exec gunzip {} +

-exec gunzip {} +প্রদান করবে gunzipতার কমান্ড লাইন অনেক কিন্তু অনেকগুলি ফাইলের নাম দিয়ে। এটি আরও কার্যকর -exec gunzip {} \;যার gunzipথেকে প্রতিটি ফাইলের জন্য একটি নতুন প্রক্রিয়া শুরু হয় ।


3
এক find, কম gunzip!
ডান

2
মনে রাখবেন যে "+" একটি জিএনইউজম এবং তাই * বিএসডি-এর মতো নন-জিএনইউ সিস্টেমে কাজ করবে না।
মনিকা পুনরায় ইনস্টল করুন - এম শ্র্র্ডার

3
বিএসডি পরবর্তী সংস্করণগুলি find"+" স্বরলিপিটি অনুমোদন করে। উদাহরণস্বরূপ, BSD 10.1 এর findম্যান পৃষ্ঠাটি দেখুন । ওএস এক্সেও প্রযোজ্য (১০.৯ এবং পরে কমপক্ষে, সম্ভবত আগে)।
প্লাজমা 19

7

আপনি যখনই "যুক্তি তালিকা খুব দীর্ঘ" ত্রুটি পেয়ে থাকেন তবে আপনি প্রতিটি বার ব্যবহার করতে চান আর্গুমেন্টের একটি উপসেট সহ একাধিকবার কাঙ্ক্ষিত কমান্ডের সাহায্যে চারপাশে কাজ করতে পারেন। xargsএমন একটি সরঞ্জাম যা আপনাকে স্বয়ংক্রিয়ভাবে এটি করতে সহায়তা করে।

find . -type f -a -name \*.pdb.gz -print0 | xargs -0 gunzip

-execdir gunzip "{}" \;xargs প্রতিটি ফাইলের জন্য পৃথকভাবে গানজিপ আহ্বান করবে এর মতো অদক্ষতা কি নেই? এটাই আমার পাতায় পঠন।
গগৌড

5
না, কমান্ড লাইনে xargsযতগুলি ফাইলের নাম উপযুক্ত হবে তেমন স্টাফ করবে gunzip। চেষ্টা করে দেখুন! echo a b c d e f | xargs echoকেবলমাত্র echo6 টি আর্গুমেন্টের সাথে একবার আহ্বান জানানো হয় যাতে আপনি আউটপুটটির এক লাইন দেখতে পান (যদিও কার্যকর করতে অযথা কমান্ড !!!!) তবে আপনি যদি কমান্ডের অনুরোধে xargsকেবল 3 টি আর্গুমেন্ট সরবরাহ করতে বাধ্য হন echo a b c d e f | xargs -n 3 echoতবে আপনি 2 লাইন আউটপুট পাবেন ।
সেলেদা

4
ব্যবহারের আর একটি সুবিধা xargsহ'ল -Pবিকল্পটি সহ gunzipআপনি সমান্তরালে একাধিক প্রক্রিয়া চালাতে পারেন যা (আপনার সিস্টেমের সঠিক পরামিতিগুলির উপর নির্ভর করে) দ্রুত যেতে পারে।
স্মার্মস

-P@psmears এর পয়েন্টারের জন্য ধন্যবাদ । এখন আমিও কিছু শিখেছি!
সেলেদা

1

আমি মনে করি এটি কাজ করা উচিত, এটি প্রতিটি ফাইলের পাথ / নাম স্বতন্ত্রভাবে প্রক্রিয়াজাতকরণের জন্য গানজিপে পাস করে:

find /my/dir -name "*.pdb.gz" -execdir gunzip "{}" \;

1
এটি প্রতি ফাইলটিতে একবার গানজিপ কার্যকর করবে। জন 1024 এর উত্তরটি কিছুটা ভিন্ন উপায়ে দেখুন যা সেই অদক্ষতা এড়ায়
সেলেদা

@ কেলাডা এটি ইচ্ছাকৃত ছিল; আমার উদ্বেগ ছিল যে ওভারলোডিং গানজিপের কারণে + ব্যবহার করা আবার ত্রুটি বার্তার দিকে নিয়ে যেতে পারে। যদি জন 1024 এর পদ্ধতিটি কাজ করে তবে এটি প্রযুক্তিগতভাবে আরও দক্ষ, তবে আমার যদি কাজ না করে তবে কাজ করা উচিত।
গগৌড

1
findসঙ্গে +এবং xargsস্পষ্টভাবে মনে ঠিক সমস্যার সাথে ডিজাইনার হয়। অপারেটিং সিস্টেমের সীমা অতিক্রম না করে তারা সর্বদা যথাসম্ভব যতগুলি আর্গুমেন্ট সরবরাহ করবে। কারণ, উপায় দ্বারা, এটি হল একটি অপারেটিং সিস্টেমের সীমা, সঙ্গে কিছুই করার gunzip
সেলেদা

1
@ ক্যালাডা ঠিক আছে সেই তথ্যের জন্য ধন্যবাদ, সুতরাং সম্ভবত '+' বন্দুকের সাহায্যে একাধিকবার ডাকা হতে পারে, তবে 320,000 বারেরও কম বার?
গগৌড

1
সঠিক।
সেলেদা

1

এইভাবে চেষ্টা করুন:

find . -name '*.gz' -exec gunzip {} \;

3
এটি gunzipপ্রতি ফাইল প্রতি একবার কার্যকর করা হবে । জন 1024 এর উত্তরটি কিছুটা ভিন্ন উপায়ে দেখুন যা সেই অদক্ষতা এড়ায়
সেলেদা

নিশ্চিত করুন যে * ইন *
.জিজেড

1

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

find . -name "*.gz" | parallel -X gunzip {}

1
যুক্তি তালিকাটি parallelদীর্ঘ দীর্ঘায়িত হওয়ায় এটি কি ব্যর্থ হবে না ?
ব্যবহারকারী 253751

@ মিম্বিস হ্যাঁ, আমি আসল সমস্যাটি ভুলে গিয়েছি, আমি আমার পোস্টটি আপডেট করব
অ্যান্থন

যুক্তি তালিকাটি দীর্ঘ দীর্ঘায়িত হওয়ায় এখনও তা ব্যর্থ হবে না find?
ব্যবহারকারী 253751

1
হ্যাঁ তবে আপনি সমস্ত ফাইলের নাম findকমান্ড লাইনেই পাস করছেন ।
ব্যবহারকারী 253751

মনে হচ্ছে প্রশ্নের উত্তর দেওয়ার জন্য এটি কোনও ভাল দিন নয়, আমি যুক্তিটি উদ্ধৃত করতে ভুলে গিয়েছিলাম-name
এন্থন

-1

findআপনি সাবফোল্ডারগুলির উল্লেখ না করায় এটির জন্য এটি ব্যবহার করা অপ্রয়োজনীয় । আপনার যা করা দরকার তা হ'ল:

for f in *.gz;do gunzip $f;done

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