पाठ स्ट्रिंग युक्त फ़ाइलों को खोजने और उन्हें स्थानांतरित करने के लिए Grep कमांड


15

मैं इस कमांड का उपयोग करके एक विशिष्ट टेक्स्ट स्ट्रिंग वाले फ़ोल्डर में फ़ाइलों का पता लगाने में सक्षम हूं:

grep -lir 'string' ~/directory/*

मैं उपरोक्त परिणाम में दिखाई देने वाली फ़ाइलों को किसी अन्य स्थान पर कैसे स्थानांतरित करूं?


यही पर है। grep -i -Z -r -l 'string' . | xargs -I{} mv {} ./folder_name
एलन डोंग

जवाबों:


10

हमेशा की तरह, सावधान रहना grep -r-rएक मानक विकल्प नहीं है, और GNU के सभी लेकिन बहुत हालिया संस्करणों की तरह कुछ कार्यान्वयन में grep, यह निर्देशिका पेड़ के नीचे उतरते समय प्रतीकात्मक लिंक का अनुसरण करता है, जो कि आम तौर पर आप क्या चाहते हैं और गंभीर प्रभाव नहीं हो सकता है यदि उदाहरण के लिए एक सिमलिंक है "/ / "कहीं निर्देशिका पेड़।

यूनिक्स दर्शन में, आप फ़ाइलों के लिए निर्देशिकाओं को खोजने के लिए एक कमांड का उपयोग करते हैं, और इसकी सामग्री को देखने के लिए एक और।

GNU टूल का उपयोग करना, मैं करूँगा:

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

लेकिन फिर भी, दौड़ की स्थितियों और संभावित सुरक्षा मुद्दों से सावधान रहें यदि आप इसे किसी अन्य उपयोगकर्ता द्वारा लिखी गई निर्देशिका पर एक उपयोगकर्ता के रूप में चलाते हैं।


इससे मुझे त्रुटि का पता चलता है: संकेत द्वारा समाप्त किया गया 'grep' 13. किसी भी विचार में क्या गलत हो रहा है?
रीना पारेख

@ReenaParekh, जो एक SIGPIPE होगा। यह केवल तभी होगा जब xargsइसकी आर्ग-फाइल के अंत में पढ़ने से पहले बाहर निकल जाए जो तब तक नहीं होनी चाहिए जब तक कि xargs को खुद को मार न दिया जाए या किसी भी कारण से विफल न हो जाए, जिस स्थिति में मैं आपसे उस बारे में कोई त्रुटि देखूंगा।
स्टीफन चेज़लस

15

तीसरे वाक्य रचना के xargsसाथ संगीत कार्यक्रम में उपयोग करें mv:mv [OPTION]... -t DIRECTORY SOURCE...

grep -lir 'string' ~/directory/* | xargs mv -t DEST

विशेष वर्ण (स्थान, उद्धरण) युक्त फ़ाइलों के बारे में सावधान रहें। यदि यह आपका मामला है, तो सूची को फ़िल्टर करने के साथ sed(फ़ाइल नाम के आसपास उद्धरण जोड़कर s/^/'/;s/$/'/) मदद कर सकता है, लेकिन आपको यह सुनिश्चित करना होगा, ये उद्धरण फ़ाइल नाम में दिखाई नहीं देंगे। GNU grepमें NUL-terminate फ़ाइलनाम के लिए -Z/ --nullविकल्प है।

प्लेसहोल्डर स्ट्रिंग ( ) के साथ तीसरे सिंटैक्स का एक विकल्प mvउपयोग कर रहा है ।xargs-I

एक अन्य विकल्प कमांड प्रतिस्थापन है - $( )या बैरिक ``(बैश में) जैसा कि ire_and_curses के उत्तर में वर्णित है।


3
gnu grep शून्य-बाइट वर्ण द्वारा फ़ाइल नामों को अलग करने के लिए एक -Z ध्वज का समर्थन करता है, जो जब -0 ध्वज के साथ xargs के संयोजन में उपयोग किया जाता है, तो आपके द्वारा
उल्लिखित

@ChandraRavoori धन्यवाद, मैंने जवाब अपडेट कर दिया है।
पेट्रॉफ

7

यदि आपके फ़ाइल नामों में कोई विशेष वर्ण (व्हाट्सएप या \[*?) नहीं है, तो कमांड प्रतिस्थापन का उपयोग करें :

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

बैकटिक्स को हटा दिया गया है; इसके बजाय अधिक पोर्टेबल, पठनीय और स्टैकेबल $ (...) का उपयोग करें।
उपयोगकर्ता अज्ञात

2

केवल POSIX निर्दिष्ट सुविधाओं का उपयोग करना, और फ़ाइल नाम के बारे में कोई धारणा बनाना :

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

टिप्पणियाँ:

आपने कहा "स्ट्रिंग" नहीं "पैटर्न," इसलिए -F(निश्चित स्ट्रिंग खोज) विकल्प grepउचित लगता है।

यदि आपकी गंतव्य निर्देशिका आपकी खोज निर्देशिका के अंदर कहीं भी है, तो आपके पास कुछ अप्रिय दौड़ स्थितियां हो सकती हैं।

POSIX चश्मा के लिए grep

POSIX चश्मा के लिए find


यह 12os पर Macos / BSD
अली

0

GNU समानांतर का उपयोग करना :

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

ht / @ लिन-डोंग xargs के साथ अपने मूल उत्तर के लिए।


अच्छा होता अगर आप एक साल पहले से टिप्पणियों में @ लिंडोंग के जवाब का श्रेय देते।
रोइमा

0

-जबकि आपके पास डेस्टिनेशन डायरेक्टरी 'बाहरी' है और सभी XLS फाइल को स्थानांतरित करने की आवश्यकता है, तो आप नीचे कमांड की कोशिश कर सकते हैं

सुडो एमवी find /var/log/ -type f -name "*.xls"/ बाहरी /

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.