পাঠ্য স্ট্রিংযুক্ত ফাইলগুলি সন্ধান করতে এবং সেগুলি সরাতে গ্রেপ কমান্ড


15

আমি এই কমান্ডটি ব্যবহার করে একটি নির্দিষ্ট পাঠ্য স্ট্রিংযুক্ত ফোল্ডারে ফাইলগুলি সনাক্ত করতে সক্ষম হয়েছি:

grep -lir 'string' ~/directory/*

উপরের ফলাফলটিতে প্রদর্শিত ফাইলগুলি অন্য স্থানে কীভাবে স্থানান্তর করব?


এটা এখানে. grep -i -Z -r -l 'string' . | xargs -I{} mv {} ./folder_name
অ্যালান ডং

উত্তর:


10

সর্বদা হিসাবে, সাবধান grep -r-rকোনও স্ট্যান্ডার্ড বিকল্প নয় এবং কিছু বাস্তবায়ন যেমন GNU- এর সমস্ত তবে খুব সাম্প্রতিক সংস্করণগুলির মধ্যে grep, এটি ডিরেক্টরী ট্রি অবতরণ করার সময় প্রতীকী লিঙ্কগুলি অনুসরণ করে যা সাধারণত আপনি যা চান তা নয় এবং উদাহরণস্বরূপ "/ "ডিরেক্টরি গাছের কোথাও।

ইউনিক্স দর্শনে, আপনি ফাইলগুলির ডিরেক্টরি অনুসন্ধান করার জন্য একটি আদেশ এবং তার বিষয়বস্তুটি দেখার জন্য অন্য একটি ব্যবহার করেন।

জিএনইউ সরঞ্জামগুলি ব্যবহার করে, আমি করব:

xargs -r0 --arg-file <(find . -type f -exec grep -lZi string {} +
  ) mv -i --target-directory /dest/dir

তবে তারপরেও, রেস শর্ত এবং সম্ভাব্য সুরক্ষার সমস্যা থেকে সাবধান থাকুন যদি আপনি অন্য কোনও ব্যবহারকারীর দ্বারা লিখিতযোগ্য ডিরেক্টরিতে এটির ব্যবহারকারী হিসাবে চালিত হন।


এটি আমাকে ত্রুটিটি খুঁজে পেতে দেয়: signal গ্রেপ 'সিগন্যাল 13 দ্বারা সমাপ্ত। কোন সমস্যা কি ঘটছে?
রেনা পারেক

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

15

তৃতীয় সিনট্যাক্স 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 এর উত্তরে উল্লিখিত হয়েছে।


3
শূন্য বাইট অক্ষর দ্বারা ফাইলের নাম পৃথক করতে gnu গ্রেপ একটি -Z পতাকা সমর্থন করে, যা যখন -0 পতাকার সাথে জার্গার্সের সাথে মিলিতভাবে ব্যবহৃত হয়, আপনি বর্ণিত বিশেষ অক্ষরের ইস্যুটি পেতে পারেন
ইরুবার

@ চন্দ্ররাভুরি ধন্যবাদ, আমি উত্তর আপডেট করেছি।
পিটারফ

7

যদি আপনার ফাইলের নামগুলিতে কোনও বিশেষ অক্ষর (সাদা স্থান বা \[*?) না থাকে তবে কমান্ড প্রতিস্থাপনটি ব্যবহার করুন :

mv `grep -lir 'string' ~/directory/*` destination/

ব্যাকটিক্স অবহেলা করা হয়; পরিবর্তে আরও পোর্টেবল, পঠনযোগ্য এবং স্ট্যাকযোগ্য use (...) ব্যবহার করুন।
ব্যবহারকারী অজ্ঞাত

2

কেবলমাত্র POSIX নির্দিষ্ট বৈশিষ্ট্য ব্যবহার করা এবং ফাইলের নাম সম্পর্কে কোনও অনুমান করা:

find ~/directory -type f -exec grep -qiF 'string' {} \; -exec mv {} /path/to/dest \;

মন্তব্য:

আপনি "স্ট্রিং" "প্যাটার্ন নয়" বলেছিলেন, সুতরাং -F(স্থির স্ট্রিং অনুসন্ধান) বিকল্পটি grepউপযুক্ত বলে মনে হচ্ছে।

আপনার গন্তব্য ডিরেক্টরিটি যদি আপনার অনুসন্ধান ডিরেক্টরিটির ভিতরে যে কোনও জায়গায় থাকে তবে আপনার কাছে কিছু অপ্রীতিকর জাতিগুলির শর্ত থাকতে পারে।

POSIX চশমা জন্য grep

POSIX চশমা জন্য find


এটি ম্যাকোস / বিএসডি-র সেরা সমাধান হতে পারে
আলী

0

GNU সমান্তরাল ব্যবহার :

grep -i -Z -r -l 'string' . | parallel 'mv {} destination/{}'

এইচআরটি / @ লিন-ডং তার xargs সহ মূল উত্তরটির জন্য।


আপনি যদি এক বছর আগে মন্তব্যগুলিতে @ লিন্ডংয়ের উত্তর জমা দিয়েছিলেন তবে ভাল হত।
রোয়াইমা

0

মনে করুন যে আপনার গন্তব্য ডিরেক্টরিটি 'বাহ্যিক' হিসাবে রয়েছে এবং সমস্ত এক্সএলএস ফাইল সরানো দরকার, আপনি নীচের কমান্ডটি চেষ্টা করতে পারেন

সুডো এমভি find /var/log/ -type f -name "*.xls"/ বাহ্যিক /

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