ডিরেক্টরি কাঠামো ধরে রেখে ডিরেক্টরিতে সমস্ত পিডিএফ আপ করুন Tar


11

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

উদাহরণস্বরূপ, বলুন আমার একটি ডিরেক্টরি ছিল যা দেখতে দেখতে এটির মতো ছিল:

dir
dir/subdir1
dir/subdir1/subsubdir1/song.mp3
dir/subdir2
dir/subdir2/subsubdir1
dir/subdir2/subsubdir1/document.pdf
dir/subdir2/subsubdir1/another-song.mp3
dir/subdir2/subsubdir1/top-ten-movies.txt
dir/subdir3
dir/subdir3/another-document.pdf

কমান্ডটি চালানোর পরে, আমি এটি dir.tar.gzধারণ করতে চাই :

dir
dir/subdir2
dir/subdir2/subsubdir1
dir/subdir2/subsubdir1/document.pdf
dir/subdir3
dir/subdir3/another-document.pdf

সম্ভব?

উত্তর:


10

এটি সমস্ত পিডিএফ তালিকাবদ্ধ করবে:

$ find dir/ -name '*.pdf'
./dir/subdir2/subsubdir1/document.pdf
./dir/subdir3/another-document.pdf

আপনি xargsএটি একক স্থান-সীমিত রেখা হিসাবে পেতে পাইপ tarকরতে পারেন এবং সংরক্ষণাগারটি তৈরি করতে সেইটিকে খাওয়ান :

$ find dir/ -name '*.pdf' | xargs tar czf dir.tar.gz

(এই ভাবে খালি ডিরেক্টরি বাদ দেয়)


1
এটি এত দুর্দান্ত, সহায়তার জন্য ধন্যবাদ। আমি যা নিয়ে এসেছি তা এখানে:find docs \( -iname '*.pdf' -o -iname '*.mp3' \) -printf '"%p"\n' | xargs tar czf docs-media.tar.gz
ম্যাট আলেকজান্ডার

3
@ ম্যাটটেলএক্সএক্স: সাবধান হন যে কোনও ফাইলের নাম ফাঁক বা \'"(xargs এর ফল্ট) থাকলে এই আদেশটি কাজ করবে না এবং খুব বেশি ফাইলের নাম (কার্নেলের ত্রুটি) থাকলে কাজ করবে না।
গিলেস 'খারাপ হয়ে যাওয়া বন্ধ করুন'

2
@ গিলস ফাঁকা স্থান এবং একক উদ্ধৃতি সহ ফাইলের নাম সম্পর্কিত, -printf '"%p"\n'অংশটি এটির যত্ন নিচ্ছে (কমপক্ষে এটি আমার পক্ষে হয়েছিল)।
ম্যাট আলেকজান্ডার

1
@ গিলস কর্নেল সীমাবদ্ধতা সম্পর্কে আকর্ষণীয়। লিনাক্সের একটি কমান্ডে আপনার কত যুক্তি থাকতে পারে?
ম্যাট আলেকজান্ডার

5
ওহ, "কাজ করবে না" - এ, এখানে লক্ষ্য করুন যে ব্যর্থতা মোডটি হ'ল কমান্ড লাইনটি যদি দীর্ঘ হয় তবে xargs এটিকে বিভক্ত করে দেবে, যাতে শেষ বারের অনুরোধটি নীরবে পূর্ববর্তী অনুরোধগুলির দ্বারা লিখিত ফাইলগুলি মুছে ফেলা হবে
গিলস

6

বাশ ≥4 বা zsh এবং GNU টার সহ:

tar -czf dir.tar.gz dir/**/*.pdf

আপনার যদি খুব বেশি সংখ্যক পিডিএফ ফাইল থাকে এবং কমান্ড লাইনটি দীর্ঘ হয় তবে এটি কাজ করতে পারে না। তারপরে আপনার আরও জটিল অনুসন্ধান-ভিত্তিক সমাধানের প্রয়োজন হবে (আবার, জিএনইউ টার ব্যবহার করে):

tar -cf dir.tar -T /dev/null
find dir -name '*.pdf' -exec tar -rf dir.tar {} +
gzip dir.tar

বিকল্পভাবে (এবং বহনযোগ্যভাবে) আপনি প্যাক্স সহ সংরক্ষণাগার তৈরি করতে পারেন ।

pax -w -x ustar -s '/\.pdf$/&/' -s '/.*//' . | gzip >dir.tar.gz

প্রথমটি তাদের নাম পরিবর্তন না করে -sসমস্ত .pdfফাইল অন্তর্ভুক্ত করার জন্য বলে । দ্বিতীয়টি -sঅন্য সমস্ত ফাইলের একটি খালি নামে নামকরণ করতে বলে, যার অর্থ আসলে সংরক্ষণাগারে এগুলি অন্তর্ভুক্ত না করা।


হ্যাঁ, আমি zsh এর উল্লেখ করতে চাইছিলাম **; আমি এমনকি বুঝতে পারছি না ব্যাশ 4 এখন যে ছিল
মাইকেল Mrozek
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.