मैं उन फ़ाइलों की प्रतिलिपि बनाने के लिए xargs का उपयोग कैसे कर सकता हूं जिनके नाम में स्थान और उद्धरण हैं?


232

मैं एक निर्देशिका के नीचे फाइलों का एक गुच्छा कॉपी करने की कोशिश कर रहा हूं और कई फाइलों में उनके नाम में रिक्त स्थान और एकल-उद्धरण हैं। जब मैं एक साथ findऔर grepसाथ स्ट्रिंग करने की कोशिश करता xargsहूं, तो मुझे निम्नलिखित त्रुटि मिलती है:

find .|grep "FooBar"|xargs -I{} cp "{}" ~/foo/bar
xargs: unterminated quote

Xargs के अधिक मजबूत उपयोग के लिए कोई सुझाव?

यह बीएसडी के साथ मैक ओएस एक्स 10.5.3 (तेंदुआ) पर है xargs


2
इसके लिए GNU xargs त्रुटि संदेश एक एकल उद्धरण वाले फ़ाइल नाम के बजाय अधिक उपयोगी है: "xargs: बेजोड़ एकल उद्धरण; डिफ़ॉल्ट उद्धरणों के लिए xargs विशेष हैं जब तक कि आप -0 विकल्प का उपयोग नहीं करते हैं"।
स्टीव जेसप

3
GNU xargs का भी --delimiterविकल्प ( -d) है। इसे \nसीमांकक के साथ आज़माएं , यह xargsकई शब्दों / तर्कों में रिक्त स्थान के साथ लाइनों को अलग करने से रोकता है।
मैटियनको

जवाबों:


199

आप सभी को एक ही findकमांड में जोड़ सकते हैं :

find . -iname "*foobar*" -exec cp -- "{}" ~/foo/bar \;

यह फ़ाइल नाम और निर्देशिका को उन स्थानों के साथ हैंडल करेगा। आप -nameकेस-संवेदी परिणाम प्राप्त करने के लिए उपयोग कर सकते हैं ।

नोट: --झंडा cpइसे -विकल्प के रूप में शुरू होने वाली फ़ाइलों को संसाधित करने से रोकता है ।


70
लोग xargs का उपयोग करते हैं क्योंकि आमतौर पर हर बार 200 तर्कों के साथ निष्पादन योग्य 5 बार कॉल करने की तुलना में यह एक बार किसी तर्क के साथ 1000 बार कॉल करने के लिए तेजी से होता है।
tzot

12
क्रिस जस्टर-यंग का जवाब "अच्छा जवाब" होना चाहिए ... अगर कोई फ़ाइल नाम "-" से शुरू होता है, तो यह समाधान काम नहीं करता है। कम से कम, इसे cp के बाद "-" की आवश्यकता है।
केल्टिया

11
गति का उदाहरण - 829 से अधिक फाइलों में, "खोज -सेक्स" विधि में 26 सेकंड लगे, जबकि "फाइंड -प्रिंट0 | xargs --null" विधि टूल 0.7 सेकंड। महत्वपूर्ण अंतर।
पीटर पोर्टर

7
@tzot देर से टिप्पणी लेकिन फिर भी, xargsआप जिस समस्या का वर्णन कर रहे हैं, उसे संबोधित करने की आवश्यकता नहीं है, findपहले से ही -exec +विराम चिह्न के साथ इसका समर्थन करता है ।
जुलैग्रे

3
रिक्त स्थान से निपटने के तरीके के सवाल का जवाब नहीं देता
बेन ग्लासर

117

find . -print0 | grep --null 'FooBar' | xargs -0 ...

मुझे इस बात की जानकारी नहीं है कि तेंदुए पर समर्थन grepकरता है --null, न ही xargsसमर्थन करता है -0, लेकिन जीएनयू पर यह सब अच्छा है।


1
तेंदुआ "-Z" (यह GNU grep है) का समर्थन करता है और निश्चित रूप से (1) और xargs (1) "-0" का समर्थन करता है।
केल्टिया

1
OS X पर 10.9 का grep -{z|Z}अर्थ है "zgrep के रूप में व्यवहार करें" (डिकम्प्रेस) और न कि "प्रत्येक फ़ाइलनाम के बाद एक शून्य बाइट प्रिंट करें"। grep --nullउत्तरार्द्ध को प्राप्त करने के लिए उपयोग करें ।
बासिम

4
इसमें गलत क्या है find . -name 'FooBar' -print0 | xargs -0 ...?
क्वेंटिन प्रदीप

1
@QuentinPradet जाहिर है, "FooBar" जैसे एक निश्चित स्ट्रिंग के लिए, -nameया -pathबस ठीक काम करें। ओपी ने grep, संभवतः उपयोग को निर्दिष्ट किया है क्योंकि वे नियमित अभिव्यक्तियों का उपयोग करके सूची को फ़िल्टर करना चाहते हैं।
क्रिस जस्टर-यंग

1
@ हाय-एंजेल यही कारण है कि मैं xargs -0 के साथ संयोजन के रूप में उपयोग करें find -print0। बाद वाले प्रिंट NUL टर्मिनेटर के साथ फाइल करते हैं और पूर्व में इस तरह से फाइल प्राप्त होती है। क्यों? यूनिक्स में फिल्म्स में न्यूलाइन वर्ण हो सकते हैं। लेकिन उनमें NUL वर्ण नहीं हो सकते।
क्रिस जस्टर-यंग

92

मूल पोस्टर क्या चाहता है इसका सबसे आसान तरीका है कि किसी भी व्हाट्सएप से सीमांकक को केवल इस तरह के अंत के चरित्र को बदलना है:

find whatever ... | xargs -d "\n" cp -t /var/tmp

4
यह anwser सरल, प्रभावी और सीधे बिंदु पर है: xargs के लिए निर्धारित डिफ़ॉल्ट सीमांकक बहुत व्यापक है और ओपी जो करना चाहता है उसके लिए उसे संकुचित करना होगा। मैं इस पहले हाथ को जानता हूं क्योंकि मैं आज इसी तरह के मुद्दे पर भाग रहा था, सिवाय साइबरविन के कुछ ऐसा ही कर रहा था। अगर मैंने xargs कमांड के लिए सहायता पढ़ी होती, तो शायद मैं कुछ सिरदर्द से बच जाता, लेकिन आपके समाधान ने इसे मेरे लिए ठीक कर दिया। धन्यवाद ! (हाँ, OP बीएसडी xargs का उपयोग करते हुए MacOS पर था, जिसका मैं उपयोग नहीं करता, लेकिन मुझे आशा है कि xargs "-d" पैरामीटर सभी संस्करणों में मौजूद है)।
इटियेन डेलावेनेट

7
अच्छा जवाब लेकिन मैक पर काम नहीं कर रहा। इसके बजाय हम फ़ाइल नाम के आसपास उद्धरणों को बल देने के लिए खोज को पाइप कर सकते हैंsed -e 's_\(.*\)_"\1"_g'
ishahak

10
यह स्वीकृत उत्तर होना चाहिए। सवाल का उपयोग करने के बारे में था xargs
बजे मोहम्मद अलहश

2
मैं मिलता हैxargs: illegal option -- d
नेह

1
यह इंगित करने के लायक है कि फ़ाइल नाम में कई * nix सिस्टम पर एक नया चरित्र हो सकता है। आप इसे कभी भी जंगली में चलाने की संभावना नहीं रखते हैं, लेकिन यदि आप अविश्वासित इनपुट पर शेल कमांड चला रहे हैं तो यह चिंता का विषय हो सकता है।
सोरेन ब्योर्नस्टैड

71

यह अधिक कुशल है क्योंकि यह कई बार "cp" नहीं चलता है:

find -name '*FooBar*' -print0 | xargs -0 cp -t ~/foo/bar

1
यह मेरे लिए काम नहीं किया। इसने cp ~ / foo / bar को जो कुछ भी आपको मिल रहा है उसे cp करने की कोशिश की, लेकिन इसके विपरीत नहीं
शेरविन असगरी

13
-P फ्लैग टू cp एक GNU एक्सटेंशन, AFAIK है, और OS X पर उपलब्ध नहीं है। लेकिन अगर ऐसा होता, तो यह इस उत्तर में दिखाए गए अनुसार काम करता।
प्रात:

2
मैं लिनक्स का उपयोग कर रहा हूँ। '-T' स्विच के लिए धन्यवाद। यही मैं याद कर रहा था :-)
वाहिद पजीरन्धह

59

मैं एक समस्या मे फंस गया। यहां बताया गया है कि मैंने इसे कैसे हल किया:

find . -name '*FoooBar*' | sed 's/.*/"&"/' | xargs cp ~/foo/bar

मैं sedएक ही लाइन के साथ इनपुट के प्रत्येक लाइन को स्थानापन्न करता था, लेकिन दोहरे उद्धरणों से घिरा हुआ था। से sedआदमी पेज, " ... एंपरसैंड (` `और '') प्रतिस्थापन में प्रदर्शित होने के आरई ... मिलान स्ट्रिंग से प्रतिस्थापित कर रहा है इस मामले में, -" .*, पूरे लाइन।

यह xargs: unterminated quoteत्रुटि को हल करता है।


3
मैं खिड़कियों पर हूँ और gnuwin32 का उपयोग कर रहा हूँ, इसलिए मुझे sed s/.*/\"&\"/इसे काम करने के लिए उपयोग करना पड़ा ।
पैट

हाँ, लेकिन शायद यह के साथ filenames को संभाल नहीं होगा "- जब तक sed भी उद्धरण उद्धरण नहीं?
आर्टफ्लोरोबॉट

उपयोग करना sedप्रतिभा है और अब समस्या के पुनर्लेखन के बिना सही समाधान है!
एंटोनियो

53

यह विधि Mac OS X v10.7.5 (शेर) पर काम करती है :

find . | grep FooBar | xargs -I{} cp {} ~/foo/bar

मैंने आपके द्वारा पोस्ट किए गए सटीक सिंटैक्स का भी परीक्षण किया। वह भी 10.7.5 पर ठीक काम किया।


4
यह काम करता है, लेकिन -Iइसका मतलब है -L 1(इसलिए मैनुअल कहता है), जिसका अर्थ है कि cp कमांड को एक बार प्रति फ़ाइल = v धीमी गति से चलाया जा रहा है।
Artfulrobot

xargs -J% cp% <गंतव्य dir> संभवतः OSX पर अधिक कुशल है।
वाकर डी

3
क्षमा करें, लेकिन यह गलत है। पहले यह वही त्रुटि पैदा करता है जिससे बचने के लिए टीओ चाहता था। आपको उपयोग करना होगा find ... -print0और xargs -0काम करने के लिए xargs के "डिफ़ॉल्ट रूप से उद्धरण विशेष हैं"। दूसरा, आम तौर पर xargs को दिए गए आदेशों में उपयोग '{}'नहीं {}किया जाता है, ताकि रिक्त स्थान और विशेष वर्णों के विरुद्ध सुरक्षा हो सके।
एंड्रियास स्पिंडलर

3
सॉरी एंड्रियास स्पिंडलर, मैं xargs से परिचित नहीं हूं और कुछ प्रयोग के बाद इस लाइन को पाया। यह उन अधिकांश लोगों के लिए काम करता है, जिन्होंने इस पर टिप्पणी की है और इसे आगे बढ़ाया है। क्या आप इस बारे में थोड़ा और विस्तार करेंगे कि यह किस तरह की त्रुटि पैदा करता है? इसके अलावा, क्या आपको लगता है कि आपके द्वारा सटीक इनपुट को पोस्ट करना सही होगा? धन्यवाद।
the_minted 23

12

बस का उपयोग न करें xargs। यह एक साफ-सुथरा कार्यक्रम है, लेकिन findजब गैर-तुच्छ मामलों का सामना करना पड़ता है तो यह अच्छी तरह से नहीं चलता है ।

यहाँ एक पोर्टेबल (POSIX) समाधान है, अर्थात एक की आवश्यकता नहीं है find, xargsया cpGNU विशिष्ट एक्सटेंशन:

find . -name "*FooBar*" -exec sh -c 'cp -- "$@" ~/foo/bar' sh {} +

+अधिक सामान्य के बजाय समाप्ति पर ध्यान दें ;

यह समाधान:

  • सही ढंग से फ़ाइलों और निर्देशिकाओं को एम्बेडेड स्पेस, न्यूलाइन्स या जो भी विदेशी पात्रों के साथ संभालता है।

  • किसी भी यूनिक्स और लिनक्स सिस्टम पर काम करता है, यहां तक ​​कि वे जो GNU टूलकिट प्रदान नहीं करते हैं।

  • उपयोग नहीं करता है xargsजो एक अच्छा और उपयोगी कार्यक्रम है, लेकिन findआउटपुट को ठीक से संभालने के लिए बहुत अधिक ट्विकिंग और गैर मानक सुविधाओं की आवश्यकता होती है ।

  • भी अधिक कुशल ( तेजी से पढ़ें ) स्वीकार किए जाते हैं और सबसे अधिक अगर अन्य उत्तरों के सभी नहीं है।

यह भी ध्यान दें कि जो कुछ अन्य उत्तरों या टिप्पणियों में कहा गया है, उसके बावजूद {}बेकार है (जब तक कि आप विदेशी fishशेल का उपयोग नहीं कर रहे हैं )।



1
@PeterMortensen आप शायद एंडिंग प्लस को नजरअंदाज करते हैं। बिना किसी ओवरहेड के findक्या कर सकता है xargs
जूलियरे ३

8

खोज में theprint0 विकल्प के साथ xargs के लिए --null कमांडलाइन विकल्प का उपयोग करने पर ध्यान दें।


8

उन लोगों के लिए, जो आदेशों के आधार पर, खोज के अलावा, उदाहरण के लिए ls:

find . | grep "FooBar" | tr \\n \\0 | xargs -0 -I{} cp "{}" ~/foo/bar

1
काम करता है लेकिन धीमी गति से क्योंकि -Iतात्पर्य है-L 1
Artfulrobot

6
find | perl -lne 'print quotemeta' | xargs ls -d

मेरा मानना ​​है कि यह लाइन-फीड को छोड़कर किसी भी चरित्र के लिए मज़बूती से काम करेगा (और मुझे संदेह है कि अगर आपको अपने फ़ाइल नाम में लाइन-फीड मिल गया है, तो आपको इससे भी बदतर समस्याएं हैं)। इसके लिए जीएनयू खोज की आवश्यकता नहीं है, बस पर्ल, इसलिए इसे कहीं भी बहुत अधिक काम करना चाहिए।


क्या फ़ाइल नाम में लाइन-फीड होना संभव है? कभी नहीं सुना।
mtk

2
वास्तव में यह है। कोशिश करें, जैसे,mkdir test && cd test && perl -e 'open $fh, ">", "this-file-contains-a-\n-here"' && ls | od -tx1
'18:33

1
|perl -lne 'print quotemeta'वास्तव में मैं क्या देख रहा हूँ। यहां अन्य पोस्टों ने मेरी मदद नहीं की, क्योंकि मुझे केवल मैलवेयर से संक्रमित लोगों के लिए PHP फ़ाइलों की संख्या को कम करने के findलिए उपयोग grep -rlकरने की आवश्यकता थी ।
मार्कोस

perl और quotemeta प्रिंट0 / -0 की तुलना में कहीं अधिक सामान्य हैं - रिक्त स्थान के साथ फाइल को पाइपलाइन करने के सामान्य समाधान के लिए धन्यवाद
bmike

5

मैंने पाया है कि निम्न सिंटैक्स मेरे लिए अच्छा काम करता है।

find /usr/pcapps/ -mount -type f -size +1000000c | perl -lpe ' s{ }{\\ }g ' | xargs ls -l | sort +4nr | head -200

इस उदाहरण में, मैं "/ usr / pcapps" पर माउंट किए गए फाइल सिस्टम में 1,000,000 बाइट्स पर 200 सबसे बड़ी फ़ाइलों की तलाश कर रहा हूं।

"ढूंढें" और "xargs" के बीच पर्ल लाइन-लाइनर प्रत्येक खाली भागता / उद्धरण करता है, इसलिए "xargs" किसी भी फ़ाइल नाम को एकल तर्क के रूप में "ls" में एम्बेडेड रिक्त स्थान के साथ पास करता है।


3

फ़्रेम चैलेंज - आप पूछ रहे हैं कि xargs का उपयोग कैसे करें। जवाब है: आप xargs का उपयोग नहीं करते हैं, क्योंकि आपको इसकी आवश्यकता नहीं है।

टिप्पणी द्वाराuser80168 एक तरह से वर्णन करता है हर फ़ाइल के लिए सीपी बुला बिना सीपी के साथ सीधे यह करने के लिए,:

find . -name '*FooBar*' -exec cp -t /tmp -- {} +

यह काम करता है क्योंकि:

  • cp -tध्वज की शुरुआत के निकट लक्ष्य निर्देशिका देने के लिए अनुमति देता है cpबल्कि अंत के पास से,। से man cp:
   -t, --target-directory=DIRECTORY
         copy all SOURCE arguments into DIRECTORY
  • --ध्वज बताता है cpएक फ़ाइल नाम, न कि एक ध्वज के रूप में के बाद सब कुछ की व्याख्या है, तो साथ शुरू फ़ाइलों को -या --भ्रमित न हों cp; आपको अभी भी इसकी आवश्यकता है क्योंकि -/ --वर्णों की व्याख्या की जाती है cp, जबकि शेल द्वारा किसी अन्य विशेष वर्ण की व्याख्या की जाती है।

  • find -exec command {} +संस्करण अनिवार्य रूप से xargs के रूप में ही है। से man find:

   -exec command {} +                                                     
         This  variant  of the -exec action runs the specified command on
         the selected files, but the command line is built  by  appending
         each  selected file name at the end; the total number of invoca‐
         matched  files.   The command line is built in much the same way
         that xargs builds its command lines.  Only one instance of  `{}'
         is  allowed  within the command, and (when find is being invoked
         from a shell) it should be quoted (for example, '{}') to protect
         it  from  interpretation  by shells.  The command is executed in
         the starting directory.  If any invocation  returns  a  non-zero
         value  as exit status, then find returns a non-zero exit status.
         If find encounters an error, this can sometimes cause an immedi‐
         ate  exit, so some pending commands may not be run at all.  This
         variant of -exec always returns true.

सीधे खोजने में इसका उपयोग करने से, यह एक पाइप या शेल इनवोकेशन की आवश्यकता से बचा जाता है, जैसे कि आपको फ़ाइल नाम में किसी भी खराब चरित्र के बारे में चिंता करने की आवश्यकता नहीं है।


अद्भुत खोज, मुझे कोई पता नहीं था !!! "-exec उपयोगिता [तर्क ...] {} + समान as -exec, सिवाय इसके कि` `{} 'को उपयोगिता के प्रत्येक आह्वान के लिए यथासंभव अधिक से अधिक पथनामों से बदल दिया गया है। यह व्यवहार xargs (1) के समान है। )। " बीएसडी कार्यान्वयन में।
शंकु

2

ध्यान रखें कि अन्य उत्तरों में चर्चा किए गए अधिकांश विकल्प उन प्लेटफार्मों पर मानक नहीं हैं जो उदाहरण के लिए GNU उपयोगिताओं (Solaris, AIX, HP-UX) का उपयोग नहीं करते हैं। 'मानक' xargs व्यवहार के लिए POSIX विनिर्देश देखें ।

मैं xargs के व्यवहार को भी ढूँढता हूँ जिससे यह कम से कम एक बार, बिना इनपुट के भी कमांड चलाता है, उपद्रव करने के लिए।

मैंने नामों में रिक्त स्थान की समस्याओं से निपटने के लिए xargs (xargl) का अपना निजी संस्करण लिखा था (केवल नए अंक अलग - हालांकि 'खोज ... -प्रिंट 0' और 'xargs -0' संयोजन बहुत साफ-सुथरे हैं जो फ़ाइल नाम नहीं दे सकते हैं) ASCII NUL '\ 0' वर्णों को सम्‍मिलित करें। मेरा xargl उतना पूर्ण नहीं है जितना कि प्रकाशन के लायक होना चाहिए - विशेष रूप से चूंकि GNU में ऐसी सुविधाएं हैं जो कम से कम उतनी ही अच्‍छी हैं।


2
GitHub या ऐसा नहीं हुआ
कोरी गोल्डबर्ग

@ कोरियॉल्डबर्ग: मुझे लगता है कि यह तब नहीं हुआ था।
जोनाथन लेफ्लर

POSIX को पहली जगह की findआवश्यकता नहीं xargsहै (और यह 11 साल पहले ही सच था)।
22

2

बैश (POSIX नहीं) के साथ आप एक चर के अंदर वर्तमान लाइन प्राप्त करने के लिए प्रक्रिया प्रतिस्थापन का उपयोग कर सकते हैं। यह आपको विशेष वर्णों से बचने के लिए उद्धरणों का उपयोग करने में सक्षम बनाता है:

while read line ; do cp "$line" ~/bar ; done < <(find . | grep foo)

2

मेरे लिए, मैं कुछ अलग करने की कोशिश कर रहा था। मैं अपनी .txt फ़ाइलों को अपने tmp फ़ोल्डर में कॉपी करना चाहता था। .Txt फ़ाइल नाम में रिक्त स्थान और एपोस्ट्रोफ़ वर्ण होते हैं। यह मेरे मैक पर काम किया।

$ find . -type f -name '*.txt' | sed 's/'"'"'/\'"'"'/g' | sed 's/.*/"&"/'  | xargs -I{} cp -v {} ./tmp/

1

यदि आपके सिस्टम पर ढूँढें और xarg संस्करण समर्थन नहीं करते हैं -print0और -0स्विच करते हैं (उदाहरण के लिए AIX ढूँढें और xargs) तो आप इस लुकिंग कोड का उपयोग कर सकते हैं:

 find . -name "*foo*" | sed -e "s/'/\\\'/g" -e 's/"/\\"/g' -e 's/ /\\ /g' | xargs cp /your/dest

यहाँ sed, xargs के लिए रिक्त स्थान और उद्धरण से बचने का ध्यान रखेगा।

AIX 5.3 पर परीक्षण किया गया


1

मैंने "xargs" के आसपास "xargsL" नामक एक छोटी पोर्टेबल आवरण लिपि बनाई, जो अधिकांश समस्याओं का समाधान करती है।

Xargs के विपरीत, xargsL प्रति पंक्ति एक पथनाम स्वीकार करता है। पाथने में कोई भी चरित्र हो सकता है (स्पष्ट रूप से) न्यूलाइन या एनयूएल बाइट्स को छोड़कर।

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

अतिरिक्त बोनस सुविधा के रूप में, xargsL एक बार इनपुट न होने पर कमांड नहीं चलाएगा!

अंतर पर ध्यान दें:

$ true | xargs echo no data
no data

$ true | xargsL echo no data # No output

XargsL को दिए गए किसी भी तर्क को xargs के माध्यम से पारित किया जाएगा।

यहाँ "xargsL" POSIX शेल स्क्रिप्ट है:

#! /bin/sh
# Line-based version of "xargs" (one pathname per line which may contain any
# amount of whitespace except for newlines) with the added bonus feature that
# it will not execute the command if the input file is empty.
#
# Version 2018.76.3
#
# Copyright (c) 2018 Guenther Brunthaler. All rights reserved.
#
# This script is free software.
# Distribution is permitted under the terms of the GPLv3.

set -e
trap 'test $? = 0 || echo "$0 failed!" >& 2' 0

if IFS= read -r first
then
        {
                printf '%s\n' "$first"
                cat
        } | sed 's/./\\&/g' | xargs ${1+"$@"}
fi

स्क्रिप्ट को अपनी $ PATH में कुछ निर्देशिका में रखें और भूल न जाएं

$ chmod +x xargsL

स्क्रिप्ट इसे निष्पादन योग्य बनाने के लिए।


1

बिल_स्टार का पर्ल संस्करण एम्बेडेड नईलाइन (केवल रिक्त स्थान वाले कॉप) के लिए अच्छी तरह से काम नहीं करेगा। उदाहरण के लिए उन Solaris पर जहां आपके पास GNU उपकरण नहीं हैं, एक अधिक पूर्ण संस्करण (sed का उपयोग करके) हो सकता है ...

find -type f | sed 's/./\\&/g' | xargs grep string_to_find

अपनी आवश्यकता के अनुसार खोज और grep तर्कों या अन्य आदेशों को समायोजित करें, लेकिन sed आपके एम्बेडेड newlines / रिक्त स्थान / टैब को ठीक कर देगा।


1

मैंने सोलारिस पर बिल स्टार के उत्तर को थोड़ा संशोधित किया:

find . -mtime +2 | perl -pe 's{^}{\"};s{$}{\"}' > ~/output.file

यह प्रत्येक पंक्ति के चारों ओर उद्धरण देगा। मैंने '-l' विकल्प का उपयोग नहीं किया, हालांकि यह शायद मदद करेगा।

फ़ाइल सूची मैं जा रहा था, हालांकि '-' हो सकता है, लेकिन नई सूचियाँ नहीं। मैंने किसी भी अन्य कमांड के साथ आउटपुट फ़ाइल का उपयोग नहीं किया है क्योंकि मैं समीक्षा करना चाहता हूं कि इससे पहले कि मैं बड़े पैमाने पर xargs के माध्यम से उन्हें हटाने शुरू कर पाया था।


1

मैंने इसके साथ थोड़ा सा खेला, एक्सरसाइज को संशोधित करने पर विचार करना शुरू किया, और महसूस किया कि जिस तरह के उपयोग के मामले में हम यहां बात कर रहे हैं, पायथन में एक सरल पुन: कार्यान्वयन एक बेहतर विचार है।

एक बात के लिए, ~ of० लाइनों के कोड के लिए पूरी बात का मतलब है कि यह पता लगाना आसान है कि क्या चल रहा है, और यदि अलग व्यवहार की आवश्यकता है, तो आप इसे पाने के लिए कम समय में एक नई स्क्रिप्ट में हैक कर सकते हैं। स्टैक ओवरफ्लो की तरह कहीं पर एक उत्तर।

देखें https://github.com/johnallsup/jda-misc-scripts/blob/master/yargs और https://github.com/johnallsup/jda-misc-scripts/blob/master/zargs.py

लिखा के रूप में yargs (और पायथन 3 स्थापित) आप टाइप कर सकते हैं:

find .|grep "FooBar"|yargs -l 203 cp --after ~/foo/bar

एक बार में 203 फाइलों की नकल करना। (यहां 203 सिर्फ एक प्लेसहोल्डर है, निश्चित रूप से, और 203 जैसी एक अजीब संख्या का उपयोग करने से यह स्पष्ट होता है कि इस संख्या का कोई अन्य महत्व नहीं है।)

यदि आप वास्तव में कुछ तेज चाहते हैं और अजगर की आवश्यकता के बिना, ज़ारग और यार्ग को प्रोटोटाइप के रूप में लेते हैं और सी ++ या सी में फिर से लिखते हैं।


0

आपको Foobar निर्देशिका को प्राप्त करने की आवश्यकता हो सकती है जैसे:

find . -name "file.ext"| grep "FooBar" | xargs -i cp -p "{}" .

1
मैन पेज के अनुसार, -iपदावनत -Iकिया जाता है , और इसके बजाय इसका उपयोग किया जाना चाहिए।
एक्यूमेनस

-1

यदि आप बैश का उपयोग कर रहे हैं, तो आप stdout को लाइनों की एक सरणी में बदल सकते हैं mapfile:

find . | grep "FooBar" | (mapfile -t; cp "${MAPFILE[@]}" ~/foobar)

लाभ हैं:

  • यह बिल्ट-इन है, इसलिए यह तेज है।
  • एक समय में सभी फ़ाइल नामों के साथ कमांड निष्पादित करें, इसलिए यह तेज़ है।
  • आप फ़ाइल नामों के लिए अन्य तर्क जोड़ सकते हैं। इसके लिए cp, आप यह भी कर सकते हैं:

    find . -name '*FooBar*' -exec cp -t ~/foobar -- {} +
    

    हालाँकि, कुछ कमांड में ऐसी सुविधा नहीं है।

नुकसान:

  • हो सकता है कि बहुत सारे फ़ाइल नाम हों तो अच्छा नहीं। (सीमा; मैं नहीं जानता, लेकिन मैंने 10 एमबी सूची फ़ाइल के साथ परीक्षण किया था जिसमें 10000 + फ़ाइल नाम शामिल हैं जिसमें कोई समस्या नहीं है, डेबियन के तहत)

अच्छा ... कौन जानता है कि क्या बैश ओएस एक्स पर उपलब्ध है?

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