আমি এই কমান্ডটি ব্যবহার করে একটি নির্দিষ্ট পাঠ্য স্ট্রিংযুক্ত ফোল্ডারে ফাইলগুলি সনাক্ত করতে সক্ষম হয়েছি:
grep -lir 'string' ~/directory/*
উপরের ফলাফলটিতে প্রদর্শিত ফাইলগুলি অন্য স্থানে কীভাবে স্থানান্তর করব?
আমি এই কমান্ডটি ব্যবহার করে একটি নির্দিষ্ট পাঠ্য স্ট্রিংযুক্ত ফোল্ডারে ফাইলগুলি সনাক্ত করতে সক্ষম হয়েছি:
grep -lir 'string' ~/directory/*
উপরের ফলাফলটিতে প্রদর্শিত ফাইলগুলি অন্য স্থানে কীভাবে স্থানান্তর করব?
উত্তর:
সর্বদা হিসাবে, সাবধান grep -r
। -r
কোনও স্ট্যান্ডার্ড বিকল্প নয় এবং কিছু বাস্তবায়ন যেমন GNU- এর সমস্ত তবে খুব সাম্প্রতিক সংস্করণগুলির মধ্যে grep
, এটি ডিরেক্টরী ট্রি অবতরণ করার সময় প্রতীকী লিঙ্কগুলি অনুসরণ করে যা সাধারণত আপনি যা চান তা নয় এবং উদাহরণস্বরূপ "/ "ডিরেক্টরি গাছের কোথাও।
ইউনিক্স দর্শনে, আপনি ফাইলগুলির ডিরেক্টরি অনুসন্ধান করার জন্য একটি আদেশ এবং তার বিষয়বস্তুটি দেখার জন্য অন্য একটি ব্যবহার করেন।
জিএনইউ সরঞ্জামগুলি ব্যবহার করে, আমি করব:
xargs -r0 --arg-file <(find . -type f -exec grep -lZi string {} +
) mv -i --target-directory /dest/dir
তবে তারপরেও, রেস শর্ত এবং সম্ভাব্য সুরক্ষার সমস্যা থেকে সাবধান থাকুন যদি আপনি অন্য কোনও ব্যবহারকারীর দ্বারা লিখিতযোগ্য ডিরেক্টরিতে এটির ব্যবহারকারী হিসাবে চালিত হন।
xargs
তার আরগ-ফাইলের শেষে পড়ার আগে উপস্থিত হয়ে থাকে যা এক্সারগস নিজেই মারা না যাওয়া বা কোনও কারণে ব্যর্থ হয় যদি না হয় তবে আমি আশা করি যে আপনিও সে সম্পর্কে একটি ত্রুটি দেখতে পাচ্ছেন।
তৃতীয় সিনট্যাক্স xargs
সহ কনসার্টে ব্যবহার করুন mv
:mv [OPTION]... -t DIRECTORY SOURCE...
grep -lir 'string' ~/directory/* | xargs mv -t DEST
বিশেষ অক্ষর (স্পেস, কোট) সম্বলিত ফাইল সম্পর্কে সতর্ক থাকুন। যদি এটি আপনার ক্ষেত্রে হয় তবে তালিকাটি ফিল্টার করা sed
(এর সাথে ফাইলের চারপাশে উদ্ধৃতি যোগ করা s/^/'/;s/$/'/
) সাহায্য করতে পারে তবে আপনি নিশ্চিত হতে পারেন যে এই উক্তিগুলি ফাইলের নামগুলিতে প্রদর্শিত হবে না। গনুহ grep
হয়েছে -Z
/ --null
বিকল্প NUL-বিনষ্ট ফাইলের নামের জন্য।
এর জন্য তৃতীয় সিনট্যাক্সের বিকল্প প্লেসহোল্ডার স্ট্রিং ( ) mv
ব্যবহার করে ।xargs
-I
আর একটি বিকল্প হ'ল কমান্ড প্রতিস্থাপন - $( )
বা ব্যাকটিক্স ``
(ব্যাশে) ire_and_curses এর উত্তরে উল্লিখিত হয়েছে।
যদি আপনার ফাইলের নামগুলিতে কোনও বিশেষ অক্ষর (সাদা স্থান বা \[*?
) না থাকে তবে কমান্ড প্রতিস্থাপনটি ব্যবহার করুন :
mv `grep -lir 'string' ~/directory/*` destination/
কেবলমাত্র POSIX নির্দিষ্ট বৈশিষ্ট্য ব্যবহার করা এবং ফাইলের নাম সম্পর্কে কোনও অনুমান করা:
find ~/directory -type f -exec grep -qiF 'string' {} \; -exec mv {} /path/to/dest \;
মন্তব্য:
আপনি "স্ট্রিং" "প্যাটার্ন নয়" বলেছিলেন, সুতরাং -F
(স্থির স্ট্রিং অনুসন্ধান) বিকল্পটি grep
উপযুক্ত বলে মনে হচ্ছে।
আপনার গন্তব্য ডিরেক্টরিটি যদি আপনার অনুসন্ধান ডিরেক্টরিটির ভিতরে যে কোনও জায়গায় থাকে তবে আপনার কাছে কিছু অপ্রীতিকর জাতিগুলির শর্ত থাকতে পারে।
GNU সমান্তরাল ব্যবহার :
grep -i -Z -r -l 'string' . | parallel 'mv {} destination/{}'
এইচআরটি / @ লিন-ডং তার xargs সহ মূল উত্তরটির জন্য।
মনে করুন যে আপনার গন্তব্য ডিরেক্টরিটি 'বাহ্যিক' হিসাবে রয়েছে এবং সমস্ত এক্সএলএস ফাইল সরানো দরকার, আপনি নীচের কমান্ডটি চেষ্টা করতে পারেন
সুডো এমভি find /var/log/ -type f -name "*.xls"
/ বাহ্যিক /
grep -i -Z -r -l 'string' . | xargs -I{} mv {} ./folder_name