मैं इस कमांड का उपयोग करके एक विशिष्ट टेक्स्ट स्ट्रिंग वाले फ़ोल्डर में फ़ाइलों का पता लगाने में सक्षम हूं:
grep -lir 'string' ~/directory/*
मैं उपरोक्त परिणाम में दिखाई देने वाली फ़ाइलों को किसी अन्य स्थान पर कैसे स्थानांतरित करूं?
मैं इस कमांड का उपयोग करके एक विशिष्ट टेक्स्ट स्ट्रिंग वाले फ़ोल्डर में फ़ाइलों का पता लगाने में सक्षम हूं:
grep -lir 'string' ~/directory/*
मैं उपरोक्त परिणाम में दिखाई देने वाली फ़ाइलों को किसी अन्य स्थान पर कैसे स्थानांतरित करूं?
जवाबों:
हमेशा की तरह, सावधान रहना grep -r
। -r
एक मानक विकल्प नहीं है, और GNU के सभी लेकिन बहुत हालिया संस्करणों की तरह कुछ कार्यान्वयन में grep
, यह निर्देशिका पेड़ के नीचे उतरते समय प्रतीकात्मक लिंक का अनुसरण करता है, जो कि आम तौर पर आप क्या चाहते हैं और गंभीर प्रभाव नहीं हो सकता है यदि उदाहरण के लिए एक सिमलिंक है "/ / "कहीं निर्देशिका पेड़।
यूनिक्स दर्शन में, आप फ़ाइलों के लिए निर्देशिकाओं को खोजने के लिए एक कमांड का उपयोग करते हैं, और इसकी सामग्री को देखने के लिए एक और।
GNU टूल का उपयोग करना, मैं करूँगा:
xargs -r0 --arg-file <(find . -type f -exec grep -lZi string {} +
) mv -i --target-directory /dest/dir
लेकिन फिर भी, दौड़ की स्थितियों और संभावित सुरक्षा मुद्दों से सावधान रहें यदि आप इसे किसी अन्य उपयोगकर्ता द्वारा लिखी गई निर्देशिका पर एक उपयोगकर्ता के रूप में चलाते हैं।
xargs
इसकी आर्ग-फाइल के अंत में पढ़ने से पहले बाहर निकल जाए जो तब तक नहीं होनी चाहिए जब तक कि xargs को खुद को मार न दिया जाए या किसी भी कारण से विफल न हो जाए, जिस स्थिति में मैं आपसे उस बारे में कोई त्रुटि देखूंगा।
तीसरे वाक्य रचना के 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 के उत्तर में वर्णित है।
यदि आपके फ़ाइल नामों में कोई विशेष वर्ण (व्हाट्सएप या \[*?
) नहीं है, तो कमांड प्रतिस्थापन का उपयोग करें :
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/{}'
ht / @ लिन-डोंग xargs के साथ अपने मूल उत्तर के लिए।
-जबकि आपके पास डेस्टिनेशन डायरेक्टरी 'बाहरी' है और सभी XLS फाइल को स्थानांतरित करने की आवश्यकता है, तो आप नीचे कमांड की कोशिश कर सकते हैं
सुडो एमवी find /var/log/ -type f -name "*.xls"
/ बाहरी /
grep -i -Z -r -l 'string' . | xargs -I{} mv {} ./folder_name