একসাথে একাধিক ফাইলগুলি সঙ্কোচন করা


27

আমার .zipএকটি ফোল্ডারে 200 টিরও বেশি ফাইল রয়েছে। আমি একের পর এক সেগুলি সঙ্কুচিত করতে চাই না। আমি যারা সিঙ্গল কমান্ড বা স্ক্রিপ্ট ব্যবহার করে তাদের নিষ্কাশন করতে চাই। কিভাবে যে কি.

উত্তর:


38

আপনি যদি সত্যিই তাদের সমান্তরালভাবে সঙ্কুচিত করতে চান তবে আপনি করতে পারেন

for i in *zip; do unzip "$i" & done

তবে, এন। জিপ ফাইলগুলির জন্য এন প্রক্রিয়াগুলি চালু করবে এবং এটি আপনার সিস্টেমে খুব ভারী হতে পারে। আরও নিয়ন্ত্রিত পদ্ধতির জন্য, একবারে মাত্র 10 টি সমান্তরাল প্রক্রিয়া চালু করে দেখুন:

find . -name '*.zip' -print0 | xargs -0 -I {} -P 10 unzip {}

চালু হওয়া সমান্তরাল প্রক্রিয়াগুলির সংখ্যা নিয়ন্ত্রণ করতে, -Pআপনি যা চান তা পরিবর্তন করুন । আপনি যদি উপ-ডিরেক্টরিতে পুনরাবৃত্তি করতে না চান তবে পরিবর্তে এটি করুন:

find . -maxdepth 1 -name '*.zip' -print0 | xargs -0 -I {} -P 10 unzip {}

বিকল্পভাবে, আপনি মন্তব্যগুলিতে @ ওলেট্যাঞ্জের পরামর্শ অনুযায়ী জিএনইউ সমান্তরাল ইনস্টল করতে পারেন

parallel unzip ::: *zip

3
সমান্তরালভাবে চালানো একটি দুর্দান্ত ধারণা, তবে ডিস্ক আই / ও কি প্রধান বাধা হয়ে দাঁড়াবে না?
ধানের ল্যান্ডাউ

1
@ প্যাডিল্যান্ডউ নিশ্চিত নন, আমাকে যাচাই করতে হবে। এটি ডিস্ক্রেশন অ্যালগরিদমের গতি এবং আপনার যে ডিস্কটি কল্পনা করি তার গতিতে নির্ভর করবে।
টেরডন

ব্যবহার -execবা -execdirপরিবর্তে পাইপিং xargs। এটি কেবল বোঝা সহজ নয়, এটি ত্রুটি-প্রবণতাও কম এবং সিস্টেম সংস্থানগুলিও ব্যবহার করে। find . -name '*.zip' -exec unzip {} ';'(আপনাকে অবশ্যই আধা-কোলনের উদ্ধৃতি দিতে হবে))
ধানের ল্যান্ডাউ

@PaddyLandau একমাত্র কারণ আমি xargs করার বংশীধ্বনিতুল্য করছি অনেক কিছু চালানো হয় সমান্তরাল হিসাবে ওপি জিজ্ঞাসা। -exec \;(আপনি সেমিকোলন এড়াতে পারবেন, কোটের প্রয়োজন নেই), প্রতিটি কমান্ড ক্রমান্বয়ে চালাবেন। -exec +ভাল তবে এটি এখানে কাজ করবে না যেহেতু এটি কীভাবে unzipকাজ করে না ।
টেরডন

আমি মনে করি যে আমরা ওপিকে অন্যভাবে বুঝতে পেরেছি। আপনি তাকে সমান্তরালভাবে এটি চেয়েছিলেন হিসাবে পড়েন, আমি তাকে একাধিক আদেশের পরিবর্তে একক কমান্ড হিসাবে বুঝেছিলাম। ঠিক আছে, তার এখন দুটি পদ্ধতি রয়েছে :)
ধানের ল্যান্ডাউ

17

গনুহ সমান্তরাল কমান্ড ভাল জিনিস এই ধরনের উপযুক্ত। পরে:

$ sudo apt-get install parallel

তারপর

ls *.zip | parallel unzip

এটি প্রতিটি কোরকে সমস্ত কাজ শেষ না হওয়া অবধি একটি আনজিপ নিয়ে ব্যস্ত রেখে আপনার যতটা কোর দেবে তা ব্যবহার করবে।


echo *.zipকোনও সম্ভাব্য এলএস উরফকে অতিরিক্ত তথ্য স্নিগ্ধ করা থেকে রক্ষা করার পরিবর্তে এটি ব্যবহার করা আরও ভাল ধারণা । যাইহোক, এটি @ গুরুর উত্তর হিসাবে একই সমস্যা রয়েছে, এটি হোয়াইটস্পেসযুক্ত ফাইলের নাম ভাঙে।
nyuszika7h

1
@ nyuszika7h xargsGNU এর বিপরীতে সমান্তরাল স্থান / ট্যাব / উদ্ধৃতিযুক্ত ফাইলের নাম ভাঙবে না । কেবলমাত্র ফাইলের নামগুলিতে নিউলাইন রয়েছে তবে আপনাকে অতিরিক্ত যত্ন নিতে হবে। উদাহরণস্বরূপ ব্যবহার করে:parallel unzip ::: *.zip
ওলে টেঞ্জ

@ nyuszika7h - এই ভাল কারণ এড়াতে হয় উভয় মান কমান্ড aliasing, এবং ফাইলের নামের মধ্যে নির্বাণ স্পেস।
ওয়েইন কনরাড

@ nyuszika7h ব্যবহার echoব্যবহার হিসাবে খারাপ হিসাবে ls। গ্লোব্বিং এবং কিছুক্ষণের লুপটি সবচেয়ে নিরাপদ।
টেরডন

1
@ নেটএলড্রেডজ যখন সেই সুযোগগুলিতে সেই সময়টি আরও বড় ছিল যখন সিস্টেমে কেবলমাত্র একটি চৌম্বকীয় ডিস্ক ছিল, এখনকার দিনে একাধিক স্পিন্ডল এবং ফ্ল্যাশ ডিস্কযুক্ত রেডের সাথে সেই সুযোগটি আরও কম। করণীয় হ'ল সর্বোত্তম কাজটি অবশ্যই আপনার সিস্টেমটি কীভাবে আচরণ করে তা পরিমাপ করে see আমি সম্প্রতি একটি 40 স্পিন্ডল RAID ব্যবহার করেছি যেখানে I / O ক্ষুধার্ত প্রক্রিয়াগুলির জন্য সর্বোত্তম সমান্তরালতা ছিল 10: এটি 10x গতি দেয়নি - কেবল একটি 6x, তবে 10 টিরও কম প্রক্রিয়া 6x এর চেয়ে কম দিয়েছে।
ওলে টেঞ্জ

12

আপনি নিম্নলিখিত কমান্ডটি ব্যবহার করতে পারেন:

টার্মিনালে ডিরেক্টরিটি প্রথম জিপ ফাইলগুলিতে পরিবর্তন করে:

cd /path

তারপরে সমস্ত .zip ফাইল আনজিপ করতে এই আদেশটি কার্যকর করুন:

for z in *.zip; do unzip "$z"; done

10

.zipআপনার ফোল্ডারে যদি অনেকগুলি ফাইল থাকে এবং আপনি সেগুলির সবগুলি সঙ্কুচিত করতে চান তবে টার্মিনালটি খুলুন এবং এটি ব্যবহার করে আপনার ফোল্ডারে যান:

cd <path_to_folder>

আপনার সমস্ত .zipফাইল সঙ্কুচিত করতে এখন এই আদেশটি ব্যবহার করুন:

ls *.zip | xargs -n1 unzip

3
যদি ফাইলের নামের কোনওটিতে সাদা স্থান থাকে তবে এটি ব্যর্থ হবে।
টেরডন

1
হ্যাঁ আপনি সঠিক.
g_p

echo *.zipসম্ভাব্য lsউরফটিকে অতিরিক্ত তথ্য ছিনিয়ে নেওয়া থেকে বিরত রাখার পরিবর্তে ব্যবহার করা আরও ভাল ধারণা , তবে এটি এখনও শ্বেত স্পেসের সমস্যার সমাধান করে না।
nyuszika7h

1
@ ওলেট্যাঞ্জ আপনি খেয়াল না করলে, আমি বলেছিলাম যে এটি এখনও সাদা নাম সহ ফাইলের নামগুলিতে ব্যর্থ হয়।
nyuszika7h

1
lsস্ক্রিপ্টগুলির জন্য কখনই আউটপুটের উপর নির্ভর করবেন না কারণ সংস্করণগুলির মধ্যে এর আউটপুটটি সঠিকভাবে সংজ্ঞায়িত করা হয়নি। পরিবর্তে @terdon এর উত্তরটি দেখুন কারণ এটি এই সমস্যার সমস্ত সমস্যার সমাধান করে।
ধানের ল্যান্ডাউ

6

আপনি -execযেমন পছন্দ মত ব্যবহার করতে পারেন ,

find . -name "*.zip" -exec unzip {} \;

এই হবে যদি ফাইল নামে একটি স্থান রয়েছে কাজ করি।


3

একটি নন টার্মিনাল পদ্ধতি।

কেবল জিপ ফাইলগুলি নির্বাচন করুন, একটিতে ডান ক্লিক করুন এবং চয়ন করুন extract here। আপনি একবারে সমস্ত বা কেবলমাত্র বেশ কয়েকটি জিপ ফাইল নির্বাচন করতে পারেন।


1

unzip \*.zip অথবা unzip '*.zip'

সুস্পষ্টভাবে unzip *.zipকাজ করে না, কারণ শেল এটিকে প্রসারিত করে unzip foo.zip bar.zip ...এবং unzipপ্রথম ফাইলের নাম জিপ ফাইল হিসাবে এবং নীচের ফাইলের নামগুলি সেই জিপ ফাইল থেকে আহরণের জন্য ফাইল হিসাবে ব্যাখ্যা করে।

তবে unzipইউনিক্স কমান্ডগুলির মধ্যে কিছুটা অস্বাভাবিক যে এটি নিজস্ব গ্লোব সম্প্রসারণ করে। যদি *শেলটি দিয়ে প্রসারিত না হয় তবে আনজিপ এটি করবে এবং ফলস্বরূপ সমস্ত ফাইলের নাম জিপ ফাইলগুলি প্রক্রিয়া করার জন্য ব্যাখ্যা করবে। সুতরাং এই বিশেষ ক্ষেত্রে, একটি forলুপ বা অন্যান্য xargsমত ছাড়া পালাতে পারেন।

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