मैं यह कोशिश कर रहा हूँ और यह काम नहीं कर रहा है:
ls file_* | xargs mv {} temp/
कोई विचार?
मैं यह कोशिश कर रहा हूँ और यह काम नहीं कर रहा है:
ls file_* | xargs mv {} temp/
कोई विचार?
जवाबों:
OS X पर:
ls file_* | xargs -J {} mv {} temp/
लिनक्स पर:
ls file_* | xargs -i {} mv {} temp/
/अंत में वैकल्पिक है। आप चाहें तो इसे शामिल कर सकते हैं, लेकिन यह आवश्यक नहीं है।
-i(या -J) एक टोकन निर्दिष्ट करें जो आने वाले तर्कों के साथ बदल दिया जाएगा, इसके बजाय उन्हें केवल अंत में निपटाया जाएगा। man xargs
-i{} है। या कहें -I {}।
-iहै, उसे प्रतिस्थापित किया जा रहा है। ls file_* | xargs -iFOO mv FOO temp/ठीक वैसा ही काम करता है।
find . -name "file_*" -maxdepth 0 -exec mv {} temp/ \;
findlsजहां आपके शेल द्वारा अनुमत प्रोग्राम तर्क की संख्या से अधिक फाइलें हो सकती हैं, वहां से बेहतर है ।
file_*वर्तमान निर्देशिका में केवल फाइलों को संसाधित करने की इच्छा का सुझाव देता है , जबकि find(अतिरिक्त विकल्पों के बिना) वर्तमान निर्देशिका के तहत संपूर्ण निर्देशिका ट्री की खोज करेगा।
mvआप फ़ाइलों को एक साथ या व्यक्तिगत रूप से संसाधित करते हैं, तो कोई परवाह नहीं है, कुछ अन्य उपयोग हो सकते हैं।
जैसा कि @ user1953864 द्वारा सुझाया गया है: { -i, -J} एक टोकन निर्दिष्ट करें जिसे आने वाले तर्कों के साथ बदल दिया जाएगा।
उदाहरण के लिए ls:
something.java exampleModel.java NewsQueryImpl.java readme someDirectory/
फिर सभी java फ़ाइलों को someDirectory फ़ोल्डर में ले जाने के लिए xargsनिम्नानुसार होगा:
लिनक्स पर
ls *.java | xargs -i mv {} someDirectory/
MacOS पर
ls *.java | xargs -J mv {} someDirectory
एक और उपाय हो सकता है:
for f in file_* ; do
mv $f temp/$f
done
नुकसान यह है कि यह mvप्रत्येक फ़ाइल के लिए एक नई प्रक्रिया की तलाश करता है।
xargs -n10उदाहरण के लिए)