xargs -I प्रतिस्थापन-स्ट्रेट विकल्प अंतर


16

मेरी समझ से, निम्नलिखित का मतलब समान होना चाहिए:

ls -1 | xargs file {}
ls -1 | xargs -I{} file {}

अगर -I विकल्प निर्दिष्ट नहीं है, तो यह डिफ़ॉल्ट है -I {}।

मैं वर्तमान निर्देशिका की सभी फाइलों को सूचीबद्ध करना चाहता हूं और fileउनमें से प्रत्येक पर कमांड चलाना चाहता हूं। कुछ के नाम में जगह है। हालांकि, मैंने अंतर पर ध्यान दिया। निचे देखो:

$ ls -1
Hello World
$ ls -1 | xargs file {}
{}:    ERROR: cannot open `{}' (No such file or directory)
Hello: ERROR: cannot open `Hello' (No such file or directory)
World: ERROR: cannot open `World' (No such file or directory)
$ ls -1 | xargs -I{} file {}
Hello World: directory

-I {} के साथ स्पष्ट रूप से निर्दिष्ट, फ़ाइल नामों में रिक्त अपेक्षा के अनुरूप व्यवहार किया जाता है।


3
"अगर -I विकल्प निर्दिष्ट नहीं है, तो यह डिफ़ॉल्ट to -I {}" है - यह गलत है, कम से कम GNU xargs के साथ।
जेजलिन

मैं अपनी गलती समझता हूं। मैं निर्दिष्ट करना चाहिए या तो xargs fileया xargs -I{} file {}। नहीं होना चाहिए xargs file {}। मुझे लगता है कि जब मैं स्पष्ट रूप से निर्दिष्ट कर रहा हूँ -I {}, बैश के रूप में इलाज करेंगे file "Hello World"। बिना -I {}, इसे माना जाता है file Hello World
पूर्वाभ्यास

1
(१) इस चर्चा का शेल (बैश) से बहुत कम लेना-देना है। (2) यह अच्छा है कि आप -1विकल्प जानते हैं ls, लेकिन यह डिफ़ॉल्ट रूप से तब होता है जब lsकोई फ़ाइल या पाइप का आउटपुट होता है, इसलिए आपको इसकी आवश्यकता नहीं है। (3) आप -Iपदावनत -i(निचले मामले I) विकल्प के साथ भ्रमित कर रहे हैं । -ifooके बराबर है -Ifoo, लेकिन सादे -iके बराबर है -I{}। लेकिन उपयोग करें -I{}। (४) यदि आप वास्तव में वही करना चाहते हैं जो आप कहते हैं कि आप करना चाहते हैं, तो बस क्यों नहीं file *?
स्कॉट

@ सच पूछें तो मेरा मूल इरादा `लिखना 'था। -नाम "* .मोव" | xargs -I {} फ़ाइल {} `सभी mov फ़ाइलों को पुनरावर्ती खोजने और fileउन पर चलाने के लिए। लेकिन मैं एक सरल उदाहरण का उपयोग करके आया था ls। तुम सही हो। उसके लिए, file *सबसे अच्छा है।
पूर्वाभास

1
मिल गया है -exec
क्रिस्टियन सियुपिटु

जवाबों:


20

-Iएक परिभाषित प्लेसहोल्डर की आवश्यकता है। -iविकल्प मान लेंगे {}प्लेसहोल्डर है। यह वह जगह थी जहां मुझे man xargsकम से कम साइगविन और सेंटोस पर {} की कोई धारणा मिली ।

या तो विकल्प के बिना बुलाए गए xargs को प्लेसहोल्डर की आवश्यकता नहीं है और यह सिर्फ STDIN को तर्कों के अंत में जोड़ता है।

echoअपने उदाहरणों को जोड़ने के लिए कि xargs क्या कर रहा है:

$ ls -1
Hello World/

आपका उदाहरण गलत उपयोग करता है {}:

$ ls -1 | xargs echo file {}
file {} Hello World/

इसलिए fileसीएमडी {} Hello Worldऔर त्रुटियों के आर्ग को देखता है ।

यदि आप {}अपने xargs कॉल में आसानी से उपयोग करना चाहते हैं :

$ ls -1 | xargs -i echo file {}
file Hello World/

या बिना किसी प्लेसहोल्डर के:

$ ls -1 | xargs echo file
file Hello World/

xargs के रूप में ऊपर बुलाया {} की जरूरत नहीं है। यह एक प्लेसहोल्डर के बिना कमांड के अंत में STDIN को जोड़ता है। {} का उपयोग आम तौर पर आप चाहते हैं कि एसटीडीआईएन कहीं न कहीं सीएमडी के बीच में निष्पादित हो, जैसे:

$ ls -1 | xargs -i mv {} /path/to/someplace/.

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