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


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.