पाइपिंग xargs के बाद कमांडिंग पाइपिंग


38

HP-UX ***** B.11.23 U ia64 **** असीमित-उपयोगकर्ता लाइसेंस

find . -type d -name *log* | xargs ls -la

मुझे उस निर्देशिका के logसभी फाइलों के बाद निर्देशिका नाम (जो निर्देशिका नाम में हैं) देता है।

निर्देशिका  /var/opt/SID/application_a/log/,  /var/opt/SID/application_b/log/,  /var/opt/SID/application_c/log/और इतने पर लॉग फाइल होते हैं।

मैं केवल दो नवीनतम लॉगफ़ाइल्स को lsकमांड द्वारा सूचीबद्ध करना चाहता हूं , जिन्हें मैं आमतौर पर उपयोग करता हूं ls -latr | tail -2

आउटपुट कुछ इस तरह से होना चाहिए ..

/var/opt/SID/application_a/log/
-rw-rw-rw-   1 user1    user1      59698 Jun 11  2013 log1
-rw-rw-rw-   1 user1    user1      59698 Jun 10  2013 log2
/var/opt/SID/application_b/log/
-rw-rw-rw-   1 user1    user1      59698 Jun 11  2013 log1
-rw-rw-rw-   1 user1    user1      59698 Jun 10  2013 log2
/var/opt/SID/application_c/log/
-rw-rw-rw-   1 user1    user1      59698 Jun 11  2013 log1
-rw-rw-rw-   1 user1    user1      59698 Jun 10  2013 log2

find . -type d -name *log* | xargs ls -la | tail -2मुझे उपरोक्त परिणाम नहीं देता है। मुझे जो मिलता है वह find . -type d -name *log* | xargs ls -laकमांड की अंतिम दो फाइलों की सूची है ।

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

find . -type d -name *log* | xargs sh -c "ls -ltr | tail -10"

मुझे वर्तमान निर्देशिका के अंदर दस निर्देशिका नामों की एक सूची देता है जो कि होता है /var/opt/SIDऔर जो मुझे चाहिए वह भी नहीं है।


2
आपको उद्धृत करना चाहिए *log*अन्यथा शेल इसे विस्तारित करेगा।
एंथन

ध्यान रखें कि sh -cकमांड नाम (पैरामीटर 0) को इसके दूसरे तर्क के रूप में माना जाता है, इसलिए आपको हमेशा करना चाहिए find . -type d -name *log* | xargs sh -c "ls -ltr | tail -10" lstail( lstailअंत में सूचना दें , जो $0बनाए गए शेल के लिए काम करेगा )। अन्यथा आपके पहले परिणाम उस भूमिका को भर देंगे और अप्रयुक्त हो जाएंगे।
जोनास

जवाबों:


57

आप लगभग वहाँ हैं। अपने अंतिम आदेश में, आप सही ढंग से -Iकरने के लिए उपयोग कर सकते हैंls

-I replace-str

    मानक इनपुट से पढ़े गए नामों के साथ प्रारंभिक-तर्कों में प्रतिस्थापित- आवृत्तियों की घटनाओं को बदलें । इसके अलावा, अयोग्य रिक्तियां इनपुट आइटम को समाप्त नहीं करती हैं; इसके बजाय विभाजक न्यूलाइन वर्ण है। इंप्लाइज -xऔर -L 1

के साथ

find . -type d -name "*log*" | xargs -I {} sh -c "echo {}; ls -la {} | tail -2"

आप के echoद्वारा पाया डायर होगा find, तो उस ls | tailपर करते हैं।


खोजो। -Type d -name " लॉग " | xargs -I {} sh -c "echo {}; ls -ltr {} | grep -E \" file_in | file_out \ "| tail -5" मैंने इसका उपयोग किया।
पर्सन 1

3
मैं के साथxargs -n 1 sh -c 'echo $0'
गिनहिंग

1
MacOS पर प्रतिस्थापन उद्धृत आदेश के भीतर काम नहीं किया था, इसलिए echo $0उपयोगी (और अधिक समझ में आता है) था
mpuncel

1
यह रिक्त स्थान, उपयोग के साथ फ़ाइल नामों के साथ काम करने के लिए -print0, xargs -0और भागने {}दोहरे उद्धरण चिह्नों में अंदरsh आदेश:find . -type d -name "*log*" -print0 | xargs -0 -I {} sh -c "echo \"{}\";ls -la \"{}\" | tail -2"
बेनेडिक्ट कोपेल

मैं "xargs -n 1 sh -c" इको \ $ 0 का उपयोग करता हूं $ func "` अगर मुझे $
भगवान

5

GNU समानांतर इस प्रकार के कार्यों को आसान बनाता है:

find . -type d -name "*log*" | parallel --tag "ls -la {} | tail -2"

यदि आप GNU समानांतर की पूरी स्थापना नहीं करना चाहते हैं तो आप एक न्यूनतम संस्थापन कर सकते हैं: http://git.savannah.gnu.org/cgit/parallel.git/tree/README


2

फ़्रेड्टेंटिनी के अलावा और एक सामान्य स्पष्टीकरण के रूप में (चूंकि डॉक्स थोड़ा भ्रमित हैं):

xargs -I {}मानक इनपुट से '{}' अक्षर लेते हैं और उन्हें जो कुछ भी पाइप से में आता है के साथ की जगह लेगा। इसका मतलब है कि आप वास्तव {}में किसी भी चरित्र संयोजन के साथ बदल सकते हैं (शायद अपने पसंदीदा प्रोग्रामिंग स्वाद को बेहतर बनाने के लिए)। उदाहरण के लिए : xargs -I % sh -c "echo %"। यदि आप हमेशा उपयोग करते हैं xargs -I {}तो आप इसे बदल सकते हैं xargs -iक्योंकि यह शॉर्टहैंड है।

sh -cअपने बैश बता / एक स्ट्रिंग से और मानक इनपुट से नहीं अगले आदेश को पढ़ने के लिए शेल होगा। तो लेखन sh -c "echo something"के बराबर है echo something

xargs -I {} sh -c "echo {}"इनपुट आपके द्वारा बनाई गई के साथ पढ़ा जाएगा sh -cजो है echo {}। चूंकि आपने इसे {}पाइप से प्राप्त तर्कों से बदलने के लिए कहा था , इसलिए यही होगा।

आप इसे आसानी से पाइपिंग के बिना भी परीक्षण कर सकते हैं, बस एक टर्मिनल में उपरोक्त कमांड टाइप करें। आगे आप जो भी लिखेंगे वह टर्मिनल (Ctrl-D से बाहर निकलने के लिए) आउटपुट मिलेगा।

में ls -la {}आदेश एक ही बात फिर से होता है। {}पूर्व पाइप आदेश की सामग्री के साथ बदल दिया है।

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