सबसे पहले, फ़ाइल सूची के रूप में आउटपुट का उपयोग न करेंls । शेल विस्तार या का उपयोग करें find। Ls + xargs के दुरुपयोग और उचित xargsउपयोग का एक उदाहरण के संभावित परिणामों के लिए नीचे देखें ।
1. सरल तरीका: के लिए पाश
यदि आप केवल फाइलों को अंडर प्रोसेस करना चाहते हैं A/, तो एक साधारण forलूप पर्याप्त होना चाहिए:
for file in A/*.dat; do ./a.out < "$file" > "${file%.dat}.ans"; done
2. प्री 1 क्यों नहीं ls | xargs ?
यहाँ अगर आप का उपयोग कैसे बुरी चीजें बदल सकते हैं का एक उदाहरण है lsके साथ xargsकाम के लिए। इस परिदृश्य पर विचार करें:
पहले, चलो कुछ खाली फाइलें बनाते हैं:
$ touch A/mypreciousfile.dat\ with\ junk\ at\ the\ end.dat
$ touch A/mypreciousfile.dat
$ touch A/mypreciousfile.dat.ans
फ़ाइलें देखें और उनमें कुछ भी नहीं है:
$ ls -1 A/
mypreciousfile.dat
mypreciousfile.dat with junk at the end.dat
mypreciousfile.dat.ans
$ cat A/*
मैजिक कमांड का उपयोग करके चलाएं xargs:
$ ls A/*.dat | xargs -I file sh -c "echo TRICKED > file.ans"
परिणाम:
$ cat A/mypreciousfile.dat
TRICKED with junk at the end.dat.ans
$ cat A/mypreciousfile.dat.ans
TRICKED
तो आप अभी mypreciousfile.datऔर दोनों को अधिलेखित करने में कामयाब रहे हैं mypreciousfile.dat.ans। यदि उन फ़ाइलों में कोई सामग्री होती है, तो उसे मिटा दिया जाएगा।
2. का उपयोग करना xargs : के साथ उचित तरीका है find
यदि आप उपयोग करने पर जोर देना चाहते हैं xargs, तो -0(शून्य-समाप्त नाम) का उपयोग करें:
find A/ -name "*.dat" -type f -print0 | xargs -0 -I file sh -c './a.out < "file" > "file.ans"'
दो बातें नोटिस करें:
- इस तरह से आप फ़ाइलों को
.dat.ansसमाप्त कर देंगे ;
- यह टूट जाएगा यदि कुछ फ़ाइल नाम में उद्धरण चिह्न (
") हो।
दोनों मुद्दों को विभिन्न तरीकों से हल किया जा सकता है:
find A/ -name "*.dat" -type f -print0 | xargs -0 -L 1 bash -c './a.out < "$0" > "${0%dat}ans"'
3. सब भीतर किया find ... -exec
find A/ -name "*.dat" -type f -exec sh -c './a.out < "{}" > "{}.ans"' \;
यह, फिर से, .dat.ansफ़ाइलों का उत्पादन करता है और अगर फ़ाइल के नाम होते हैं तो टूट जाएगा "। इसके बारे में जाने के लिए, bashइसे लागू करने के तरीके का उपयोग करें और इसे बदलें:
find A/ -name "*.dat" -type f -exec bash -c './a.out < "$0" > "${0%dat}ans"' {} \;