xargsनौकरी के लिए उपकरण है। वह, या findसाथ -exec … {} +। ये उपकरण कई बार एक कमांड चलाते हैं, जिसमें एक ही बार में कई तर्क दिए जा सकते हैं।
चर तर्क सूची अंत में होने पर दोनों तरीकों को अंजाम देना आसान होता है, जो यहाँ नहीं है: अंतिम तर्क mvगंतव्य है। जीएनयू उपयोगिताओं (यानी गैर-एम्बेडेड लिनक्स या सिग्विन पर) के साथ, गंतव्य को पहले पारित करने के लिए, -tविकल्प mvउपयोगी है।
यदि फ़ाइल के नाम में कोई व्हाट्सएप नहीं है और न ही कोई है \"', तो आप केवल इनपुट के रूप में फ़ाइल नाम प्रदान कर सकते हैं xargs( echoकमांड एक बैश बिलिन है, इसलिए यह कमांड लाइन की लंबाई सीमा के अधीन नहीं है):
echo !(*.jpg|*.png|*.bmp) | xargs mv -t targetdir
आप डिफ़ॉल्ट उद्धृत प्रारूप के बजाय नल-सीमांकित इनपुट का उपयोग -0करने के विकल्प का उपयोग कर सकते हैं xargs।
printf '%s\0' !(*.jpg|*.png|*.bmp) | xargs -0 mv -t targetdir
वैकल्पिक रूप से, आप फ़ाइल नामों की सूची जनरेट कर सकते हैं find। उपनिर्देशिकाओं में पुनरावृत्ति से बचने के लिए, का उपयोग करें -type d -prune। चूंकि सूचीबद्ध छवि फ़ाइलों के लिए कोई कार्रवाई निर्दिष्ट नहीं है, केवल अन्य फाइलें स्थानांतरित की जाती हैं।
find . -name . -o -type d -prune -o \
-name '*.jpg' -o -name '*.png' -o -name '*.bmp' -o \
-exec mv -t targetdir/ {} +
(इसमें शेल वाइल्डकार्ड विधियों के विपरीत डॉट फाइलें शामिल हैं।)
यदि आपके पास GNU उपयोगिताओं नहीं है, तो आप सही क्रम में तर्क प्राप्त करने के लिए एक मध्यवर्ती शेल का उपयोग कर सकते हैं। यह विधि सभी POSIX सिस्टम पर काम करती है।
find . -name . -o -type d -prune -o \
-name '*.jpg' -o -name '*.png' -o -name '*.bmp' -o \
-exec sh -c 'mv "$@" "$0"' targetdir/ {} +
Zsh में, आप लोड कर सकते हैं mvनिर्मित :
setopt extended_glob
zmodload zsh/files
mv -- ^*.(jpg|png|bmp) targetdir/
या यदि आप जाने देना पसंद करते हैं mvऔर अन्य नाम बाहरी आदेशों का उल्लेख करते रहते हैं:
setopt extended_glob
zmodload -Fm zsh/files b:zf_\*
zf_mv -- ^*.(jpg|png|bmp) targetdir/
या क्ष-शैली के दस्ताने के साथ:
setopt ksh_glob
zmodload -Fm zsh/files b:zf_\*
zf_mv -- !(*.jpg|*.png|*.bmp) targetdir/
वैकल्पिक रूप से, GNU mvऔर का उपयोग कर zargs:
autoload -U zargs
setopt extended_glob
zargs -- ./^*.(jpg|png|bmp) -- mv -t targetdir/