आप एक विशेष पैटर्न से मेल खाने वाले को छोड़कर सभी गोले में उन्नत गोलाकार पैटर्न का उपयोग किसी निर्देशिका में सभी फ़ाइलों से मिलान करने के लिए कर सकते हैं। उदाहरण के लिए, ksh, bash या zsh में, कमांड
shopt -s extglob ## needed in bash only
setopt ksh_glob ## needed in zsh only
mv /source/!(*.bak) /destination
मिलान /source
करने वाली फ़ाइलों को /destination
छोड़कर सभी फ़ाइलों को स्थानांतरित कर देगा *.bak
। Zsh में, आप यह भी लिख सकते हैं /source/^*.bak
कि क्या आप पहली बार चलते हैं setopt extended_glob
, और अधिक आम तौर पर (फिर से आवश्यकता होती है setopt extended_glob
) /source/*~*.bak
(या /source/a*~*.bak
उन सभी फ़ाइलों के लिए जिनका नाम फ़ाइलों के a
अलावा शुरू होता है .bak
, आदि)।
Zsh के पास एक मास कॉपी / मूव / लिंक कमांड है जिसका उपयोग, दूसरों के बीच, उन सभी फाइलों को स्थानांतरित करने के लिए किया जा सकता है, जो किसी पैटर्न से मेल खाते हैं। उदाहरण के लिए, निम्न आदेश को छोड़कर सभी फ़ाइलों को *.bak
ले /source
जाता है target
, और .bak
प्रक्रिया में उनका नाम जोड़ता है:
autoload zmv
zmv '/source/(*)~*.bak' '/target/$1.bak'
कई कमांड्स हैं जिन्हें rename
फ्लोटिंग कहा जाता है। डेबियन और उबंटू पर, /usr/bin/rename
एक पर्ल स्क्रिप्ट है जो फ़ाइलों को एक पर्ल एक्सप्रेशन द्वारा उत्पन्न नए नाम पर ले जाती है। यदि फ़ाइल को बाहर रखा जाना है, तो आप एक नया नाम न उत्पन्न करके नाम बदलने से फ़ाइलों को बाहर कर सकते हैं। उदाहरण के लिए, निम्न कमांड (इस विशेष rename
कार्यक्रम का उपयोग करके ) से सभी फाइलों को छोड़ *.bak
दिया /source
जाता है /target
:
rename 's!/source!/target! unless m!\.bak$!' /source/*
आप उन find
फ़ाइलों का चयन करने के लिए कमांड का उपयोग कर सकते हैं जिन्हें आप स्थानांतरित करना चाहते हैं। उदाहरण के लिए, निम्न आदेश *.bak
में /source
या एक उपनिर्देशिका को छोड़कर सभी नियमित फाइलें चलती हैं /target
(ध्यान दें कि निर्देशिका संरचना ढह गई है):
find /source -type f \! -name '*.bak' -exec mv {} /target/ \;
या (और अधिक कुशल अगर वहाँ कई फ़ाइलों को स्थानांतरित करने के लिए कर रहे हैं)
find /source -type f \! -name '*.bak' -exec sh -c 'mv "$@" "$0"' /target/ {} +
rsync
के एक सामान्यीकरण के साथ cp
और scp
बहुत शक्तिशाली शामिल / नियमों को बाहर करना। उदाहरण के लिए, आदेश प्रतियां को छोड़कर सभी फ़ाइलें निम्न *.bak
में /source
या में उप-निर्देशिका /target
, निर्देशिका संरचना का सम्मान:
rsync -a --exclude '*.bak' /source/ /target/
pax
(अन्य बातों के अलावा) cp
स्टेरॉयड पर एक और है। इसके बहिष्करण नियम rsync के रूप में लगभग शक्तिशाली नहीं हैं, लेकिन इसमें फ़ाइलों को कॉपी करने के लिए नाम बदलने की अतिरिक्त क्षमता है। यदि आप किसी फ़ाइल को खाली स्ट्रिंग में बदल देते हैं, तो उसे कॉपी से बाहर कर दिया जाता है। उदाहरण के लिए, निम्न कमांड *.bak
में /source
या उपनिर्देशिका को छोड़कर सभी फाइलों को कॉपी करता है /target
, और .bak
गुजरने में फ़ाइलों का नाम बदल देता है ।
cd /source && pax -rw -pp -s '/.*\.bak$//' -s '/$/.bak/' . /target/
ऊपर दिए गए उदाहरण में निर्देशिकाओं को बनाने का दुर्भाग्यपूर्ण पक्ष प्रभाव है foo.bak
, जिसे संयोजन के find
साथ टाला जा सकता है pax
:
{ cd /source && find . -type f; } | \
pax -rw -pp -s '/.*\.bak$//' -s '/$/.bak/' /target/
mv file1 file2 /path/to/destination
आप जो करना चाहते हैं वह नहीं करेंगे