सबसे पहले, फ़ाइल सूची के रूप में आउटपुट का उपयोग न करें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"' {} \;