कमांड-लाइन mv बहिष्करण सूची


11

वहाँ एक तरीका है mv, cpया किसी भी फ़ाइल ऑपरेशन है कि मैं प्रभावित नहीं करना चाहती सभी फ़ाइलों को निर्दिष्ट कर सकता है ?

उदाहरण के लिए, मैं फ़ाइलों के साथ एक फ़ोल्डर है कहते हैं file1, file2, और file3, और मैं ले जाना चाहते हैं file1और file2कहीं न कहीं। फ़ाइलों को स्थानांतरित करने के लिए स्पष्ट रूप से नाम देने के बजाय ( mv file1 file2 /path/to/destination), मैं फ़ाइलों को स्थानांतरित नहीं करने के लिए नाम देना चाहता हूं और फ़ोल्डर में अन्य सभी स्थानांतरित हो गए हैं ( mv --some-switch file3 /path/to/destination)


मेरा मानना ​​है कि mv file1 file2 /path/to/destinationआप जो करना चाहते हैं वह नहीं करेंगे
phunehehe

जवाबों:


19
  • आप एक विशेष पैटर्न से मेल खाने वाले को छोड़कर सभी गोले में उन्नत गोलाकार पैटर्न का उपयोग किसी निर्देशिका में सभी फ़ाइलों से मिलान करने के लिए कर सकते हैं। उदाहरण के लिए, 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/
    

बहुत बढ़िया। एक संभावित सुधार: मुझे लगता है कि findकमांड को समाप्त होने की आवश्यकता है\;
स्टीवन डी

@Steven: धन्यवाद, मैं यह भूल जाता हूँ कि आप केवल +तुरंत निम्नलिखित का उपयोग कर सकते हैं {}
गिल्स एसओ- बुराई को रोकना '

अच्छी सूची, उसके लिए thx :-)
इकोक्स

1
क्या एक जवाब, ऊपर :) बड़ा अंगूठे
Dzung गुयेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.