"অনুসন্ধান" আউটপুটগুলিতে আমি কীভাবে কেবল আপেক্ষিক পাথগুলিকে বাধ্য করতে পারি?


25

আমি এমন একটি স্ক্রিপ্ট তৈরি করার চেষ্টা করছি যা বেশ কয়েকটি ডিরেক্টরিতে একটি নির্দিষ্ট বর্ধনের সাহায্যে ফাইলগুলিকে একক টার-বলের সাথে সংকুচিত করতে পারে। স্ক্রিপ্ট ফাইলটিতে বর্তমানে আমার কাছে যা রয়েছে তা হ'ল:

find "$rootDir" -name '*doc' -exec tar rvf docs.tar {} \;

কোথায় $rootDirঅনুসন্ধানের বেস পাথ।

টার ফাইলে রাস্তাগুলি নিখুঁত ছাড়া এটি ঠিক আছে। আমি পাথগুলিকে আপেক্ষিক হতে পছন্দ করব $rootDir। আমি কীভাবে এটি করতে যাব?

বর্তমান উদাহরণ tar -tf docs.tarযেখানে $rootDirহয় /home/username/testআউটপুট:

home/username/test/subdir/test.doc
home/username/test/second.doc

আমি আউটপুটটি যা হতে চাই তা হ'ল:

./subdir/test.doc
./second.doc

উত্তর:


12

যদি আপনি findকাঙ্ক্ষিত রুট ডিরেক্টরিটি থেকে চালিত হন এবং findএর বিকল্পগুলির মধ্যে একটি নিখুঁত সূচনা পয়েন্ট নির্দিষ্ট না করেন তবে এটি এটি তৈরি করা tarকমান্ডের অনুরোধের সাথে সম্পর্কিত পাথ আউটপুট দেবে । তাই ভালো:

cd $rootDir
find . -name '*doc' -exec tar rvf docs.tar {} \;

আপনি যদি বর্তমান চলমান ডিরেক্টরিটি স্থায়ীভাবে পরিবর্তন করতে না চান এবং bashআপনার শেলটির মতো ব্যবহার করতে পারেন বা করতে পারেন তেমনই

pushd $rootDir
find . -name '*doc' -exec tar rvf docs.tar {} \;
popd

পরিবর্তে.

নোট করুন যে পুশড / পপড সমস্ত শেলের মধ্যে উপস্থিত নেই, সুতরাং ম্যান পৃষ্ঠাটি যথাযথ হিসাবে পরীক্ষা করুন। এগুলি ব্যাশে উপস্থিত রয়েছে তবে বেস শ বাস্তবায়নে নয়, সুতরাং স্পষ্টভাবে ব্যবহার করার সময় /bin/bashআপনি যদি তাদের উপর নির্ভর করতে পারেন তবে কোনও স্ক্রিপ্ট /bin/shপরিবর্তে জিজ্ঞাসা করতে পারে না (কারণ এটি কোনও ছোট শেলের মানচিত্র তৈরি করতে পারে যার মধ্যে ব্যাশের উন্নতি নেই)


ধন্যবাদ। উজ্জ্বলভাবে কাজ করেছেন। বুঝতে পারেনি যে লিনাক্স চাপ দিয়েছে / পপড করেছে।
শেন

3
অথবা কেবল ব্যবহার করুন cd $rootDirএবং cd - (কমপক্ষে bash)। ( cd $rootDir ; find ... )এছাড়াও সম্ভব হবে, অর্থাত্ একটি সাবচেলে সবকিছু করা।
ড্যানিয়েল বেক

9

আপনি নির্দেশে %Pফর্ম্যাটটি ব্যবহার করতে পারেন -printf:

find ${rootDir} -name '*.doc' -printf "%P\n"

আপনার উদাহরণে প্রদর্শিত হবে:

subdir/test.doc
second.doc

তারপরে আপনি এই findতালিকাটি একটি forএক্সপ্রেশনতে ব্যবহার করতে পারেন , যাতে আমাদের এক্সিকিউটিভ কমান্ড চালাতে, যেমন:

for f in $( find ${rootDir} -name '*.doc' -printf "%P\n" );
do
    tar rvf docs.tar ${f}
done

1
গৃহীত সমাধানটি কাজ করে তবে এটি মূলত একটি হ্যাক। আইএমএইচও এটি প্রশ্নের সঠিক সমাধান হওয়া উচিত।
নারকোলেসিকো

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