मैं लिनक्स पर xargs के साथ फ़ाइलों को कैसे स्थानांतरित कर सकता हूं?


24

मैं यह कोशिश कर रहा हूँ और यह काम नहीं कर रहा है:

ls file_* | xargs mv {} temp/

कोई विचार?


एक बहु फ़ाइल चाल संस्करण के साथ कोई भी? ( xargs -n10उदाहरण के लिए)
Gert van den Berg

जवाबों:


31

OS X पर:

ls file_* | xargs -J {} mv {} temp/

लिनक्स पर:

ls file_* | xargs -i {} mv {} temp/

1
लिनक्स पर, कम से कम, /अंत में वैकल्पिक है। आप चाहें तो इसे शामिल कर सकते हैं, लेकिन यह आवश्यक नहीं है।
स्कॉट

4
@ user1953864: -i(या -J) एक टोकन निर्दिष्ट करें जो आने वाले तर्कों के साथ बदल दिया जाएगा, इसके बजाय उन्हें केवल अंत में निपटाया जाएगा। man xargs
आमदन Am

14
आपको एक स्थान के बिना कहने की आवश्यकता हो सकती-i{} है। या कहें -I {}
स्कॉट

1
मैंने देखा कि "{}" के स्थान पर "%" का उपयोग करना भी काम करता है -% का क्या अर्थ है और {} का क्या अर्थ है? उदाहरण: ls file_ * | xargs -I% mv% temp /
dmonopoly

3
@ डामोनोपॉली: उनका कोई मतलब नहीं है। जो भी पैरामीटर -iहै, उसे प्रतिस्थापित किया जा रहा है। ls file_* | xargs -iFOO mv FOO temp/ठीक वैसा ही काम करता है।
आमदन

8

find . -name "file_*" -maxdepth 0 -exec mv {} temp/ \;

findlsजहां आपके शेल द्वारा अनुमत प्रोग्राम तर्क की संख्या से अधिक फाइलें हो सकती हैं, वहां से बेहतर है ।


2
ध्यान दें कि प्रश्न file_*वर्तमान निर्देशिका में केवल फाइलों को संसाधित करने की इच्छा का सुझाव देता है , जबकि find(अतिरिक्त विकल्पों के बिना) वर्तमान निर्देशिका के तहत संपूर्ण निर्देशिका ट्री की खोज करेगा।
स्कॉट

1
हाँ सच। -maxdepth 0इसे रोकने के लिए जोड़ें ।

"बेहतर" व्यक्तिपरक है। अधिक शक्तिशाली, अधिक जटिल और धीमी; और जब mvआप फ़ाइलों को एक साथ या व्यक्तिगत रूप से संसाधित करते हैं, तो कोई परवाह नहीं है, कुछ अन्य उपयोग हो सकते हैं।
आमदन Am

सम्पादित (जोड़ा गया -maxdepth 0)

8

उपयोग -t "mv में लक्ष्य निर्देशन निर्दिष्ट करें", यह निर्देशिका / अस्थायी गंतव्य के लिए * चलती फ़ाइलों को काम करना चाहिए

ex: - #ls -l फ़ाइल * | xargs mv -t / temp


4

जैसा कि @ 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

0

एक और उपाय हो सकता है:

 for f in file_* ; do
   mv $f temp/$f
 done

नुकसान यह है कि यह mvप्रत्येक फ़ाइल के लिए एक नई प्रक्रिया की तलाश करता है।

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