লিনাক্স একাধিক সাব-ডাইরেক্টরিগুলি আলাদা সংরক্ষণাগারগুলিতে জিজিপ করে?


16

আমি কীভাবে পৃথক সংরক্ষণাগারগুলিতে সাব-ডিরেক্টরিগুলি সংকুচিত করতে সক্ষম হব?

উদাহরণ:

directory
 subdir1
 subdir2

Subdir1 (.tar) .gz এবং subdir2 (.tar) .gz তৈরি করা উচিত

উত্তর:


27

আপনার প্রয়োজনীয়তা বিবেচনা করে এই ছোট স্ক্রিপ্টটি আপনার সেরা বিকল্প বলে মনে হচ্ছে:

cd directory
for dir in */
do
  base=$(basename "$dir")
  tar -czf "${base}.tar.gz" "$dir"
done

এটি সঠিকভাবে তাদের নামে স্পেস সহ ডিরেক্টরি পরিচালনা করে।


এটি আমাকে এই ত্রুটিটি দেয়: ব্যাশ: -সি: লাইন 1: সিনট্যাক্স ত্রুটি: ফাইলের অপ্রত্যাশিত সমাপ্তি
— EarthMind

@ আর্থমাইন্ড: এটি এখানে দুর্দান্ত কাজ করে। স্ক্রিপ্টটি সঠিকভাবে অনুলিপি করা হয়েছে কিনা তা পরীক্ষা করে দেখুন।
— জুলিয়ানো

@ আর্থমাইন্ড: আমি নিশ্চিত নই যে আপনি মূল প্রশ্নটি ভাল করে লিখেছেন, তখন। আপনি এটি আবার চালাতে চান এবং পূর্ববর্তী .tar.gz ফাইলগুলি একা রেখে নতুন .tar.gz ফাইলগুলি পেতে চান? "Tmstamp = $ (তারিখ '+% Y% m% d-% H% M') যোগ করার চেষ্টা করুন এবং $ {বেস} কে $ {বেস change - $ m tmstamp} এ পরিবর্তন করুন}
— ফ্রেইহিট

2
@ আর্থমাইন্ড: আপনি যদি সমস্ত কিছু এক লাইনে ফেলতে চলেছেন, তা নিশ্চিত করুন যে টার কমান্ডের ঠিক আগে একটি সেমিকোলন (;) রয়েছে। অন্যথায়, বেসটি শেল সহায়ক ভেরিয়েবলের পরিবর্তে পরিবেশগত ভেরিয়েবল হিসাবে তারের পরিবর্তিত হয়।
— জুলিয়ানো

@mwojtera আপনার চেষ্টা সম্পাদন করা তার নিজস্ব উত্তর হওয়া উচিত
— মেয়ে

10

এটি সম্পর্কে: find * -maxdepth 0 -type d -exec tar czvf {}.tar.gz {} \;

ব্যাখ্যা: আপনি বর্তমান ডিরেক্টরিতে সমস্ত আইটেম সন্ধান চালান। ম্যাক্সডেপথ 0 এটি প্রদত্ত আর্গুমেন্টের চেয়ে কম কোনও সংকেত দেয় না। (এই ক্ষেত্রে *, বা আপনার বর্তমান ডিরেক্টরিতে থাকা সমস্ত আইটেম) "-প্রকার" এর সাথে 'ডি' যুক্তি কেবল ডিরেক্টরিগুলির সাথে মেলে। তারপরে আর যাই হোক না কেন ম্যাচেই ট্যুর রান করে। (file the ম্যাচিং ফাইল দ্বারা প্রতিস্থাপন করা হয়)


1
তবে তারপরেও আমি ত্রুটিটি পেয়েছি যে প্রদত্ত পথটি একটি ডিরেক্টরি নয় একটি ফাইল
— EarthMind

3
একা gzip ডিরেক্টরি সংরক্ষণাগার রাখে না
— জুলিয়ানো

ডিরেক্টরিগুলি gzip করার আগে আপনাকে তারগুলি ডায়ার করতে হবে।
— 4aphink

1
ডিরেক্টরিগুলির জন্য সরাসরি জিজিপ নয়, আপনার জেড বিকল্পের সাথে ডাবের প্রয়োজন। যদিও সন্ধানের খুব সুন্দর ব্যবহার।
— ফ্রেইহাইট

3
ত্রুটি: "সন্ধান করুন: পাথ অবশ্যই এক্সপ্রেশন আগে:" প্রথম অংশটি কাজ করে, তাই আমি (কেবল ডিরেক্টরিগুলি) ব্যবহার করেছি: for dir in `find * -maxdepth 0 -type d`; do tar -cvzf ${dir}.tar.gz ${dir}; done
— জোসেফকে 29:58

4

এটি ব্লাহ নামে একটি ডিরেক্টরিতে প্রতিটি ফাইলের জন্য blah.tar.gz নামে একটি ফাইল তৈরি করবে।

$ cd directory
$ for dir in `ls`; do tar -cvzf ${dir}.tar.gz ${dir}; done

আপনি যদি ডিরেক্টরিতে কেবল ডিরেক্টরিগুলির চেয়ে বেশি (যেমন ফাইলগুলিও হন, যেমন ls ডিরেক্টরিতে সমস্ত কিছু ফিরিয়ে দেবে), তবে এটি ব্যবহার করুন:

$ cd directory
$ for dir in `find . -maxdepth 1 -type d  | grep -v "^\.$" `; do tar -cvzf ${dir}.tar.gz ${dir}; done

গ্রেপ-ভি বর্তমান ডিরেক্টরিটি বাদ দেয় যা findকমান্ডটিতে ডিফল্টরূপে প্রদর্শিত হবে।


3
Ls এবং সন্ধান উভয়ই এইভাবে ব্যবহার করা যায়নি। বিশেষত ls এর উদ্দেশ্য, ফাইলগুলি ব্যবহারকারী-পঠনযোগ্য তালিকায় উপস্থাপন করার উদ্দেশ্যে করা হয়েছে, ফাইলের তালিকা 'জন্য' হিসাবে আর্গুমেন্ট হিসাবে তৈরি করা নয়। কেবল ব্যবহার করুনfor dir in *
— জুলিয়ানো

1
আমি আপনার প্রথম পরামর্শটি চেষ্টা করেছি তবে এটি তাদের নামে স্পেস যুক্ত ডিরেক্টরিগুলির সাথে কাজ করে না
— EarthMind

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