एक को छोड़कर सभी फ़ाइलों को स्थानांतरित करें


155

मैं एक को छोड़कर सभी फ़ाइलों को कैसे स्थानांतरित कर सकता हूं? मैं कुछ इस तरह की तलाश में हूँ:

'mv ~/Linux/Old/!Tux.png ~/Linux/New/'

जहां मैं पुराने सामानों को छोड़कर नए सामानों को स्थानांतरित कर देता हूं Tux.png। -sign एक निषेध का प्रतिनिधित्व करता है। क्या नौकरी के लिए कुछ उपकरण है?

जवाबों:


142

यदि आप बैश का उपयोग करते हैं और extglobशेल विकल्प सेट है (जो आमतौर पर होता है):

mv ~/Linux/Old/!(Tux.png) ~/Linux/New/

1
जब मैंने कई वस्तुओं के लिए कमांड का परीक्षण किया तो मुझे कुछ गलत लगा: mv ~ / Linux / Old /! (Tux.png Tux1.png Tux2.png) ~ / Linux / New / यह पूरे पुराने-पाठ को खाली करता है। गलत क्या है?
लेओ लेपोल्ड हर्ट्ज़ '

5
@UnixBasics, कोशिश: ~ / लिनक्स / पुराने / (Tux.png | Tux1.png | Tux2.png)!
पीटर

@ जूलियानो बहुत कूल कमांड! क्या OR और XOR जैसे गणितीय कार्य अधिक हैं? मुझे लगता है कि एक पाइप AND के लिए है।
लेओ लेपोल्ड हर्ट्ज़ '

@ यूनिक्सबैसिस, हाँ। पर एक नजर डालें gnu.org/software/bash/manual/html_node/Pattern-Matching.html
पीटर

@ जूलियानो मैं पैटर्न के बजाय उलझन में हूं: mv ~ / Linux /? (Tux *। Png) ~ / Linux / New / mv ~ / Linux / + (Tux * .png) ~ / Linux / New / In the पूर्व। , मैं 0-1 टक्स -टॉप को स्थानांतरित करना चाहता था। उत्तरार्द्ध में, मैं 1-एन टक्स तस्वीरें स्थानांतरित करना चाहता था। वे हर बंगाली चले गए। क्यों? क्या तस्वीरों की एक विशिष्ट राशि को स्थानांतरित करना संभव है?
लेओ लेपोल्ड हर्ट्ज़ '

97

निम्नलिखित को अपने .bashrc पर रखें

shopt -s extglob

यह रेगेक्स का विस्तार करता है। फिर आप एक को छोड़कर सभी फ़ाइलों को स्थानांतरित कर सकते हैं

mv !(fileOne) ~/path/newFolder

अन्य आदेशों के संबंध में अपवाद

ध्यान दें कि, निर्देशिकाओं की प्रतिलिपि बनाने में, फॉरवर्ड-फ्लैश का उपयोग नाम में नहीं किया जा सकता है जैसा कि थ्रेड में देखा गया है कि हालत को छोड़कर क्यों एक्सग्लोब को छोड़कर? :

cp -r !(Backups.backupdb) /home/masi/Documents/

ऐसा Backups.backupdb/करना यहाँ गलत होने से पहले गलत है और मैं इसका उपयोग न तो चलती निर्देशिका में करूंगा क्योंकि गलत तरीके से उपयोग करने के जोखिम के कारण अन्य कमांड के साथ ग्लब्स और अन्य संभावित अपवाद।


3
यह वास्तव में सही उत्तर है। मेरा फ्लैट गलत था; सौभाग्य से मैंने इसे केवल कुछ फ़ाइलों के साथ एक फ़ोल्डर में उपयोग किया था। यहाँ मैसी शो विधि के बारे में अधिक जानकारी है: wiki.bash-hackers.org/syntax/pattern "विस्तारित पैटर्न भाषा" पर जाएं और आपको इस पर अधिक जानकारी मिलेगी। इस मुद्दे की ओर इशारा करने के लिए @ paul-whittaker को धन्यवाद।
मिमोरिया

यह एक पुराना उत्तर है लेकिन यह अभी भी मान्य है। मैं उबंटू 18 का उपयोग कर रहा हूं और एक्सग्लोब डिफॉल्ट रूप से सक्षम होने लगता है (मैंने इसे नहीं खरीदा)। मैंने वर्तमान निर्देशिका में सभी फाइलों को एक संग्रह में स्थानांतरित करने के लिए निम्नलिखित कमांड का उपयोग किया, जो कि इस निर्देशिका में भी है, किसी अन्य संग्रह फ़ोल्डर सहित नहीं: mv !(arc*) archive_190629b
टोनीजी

70

मैं पारंपरिक खोज और xargs के रास्ते से जाऊंगा:

find ~/Linux/Old -maxdepth 1 -mindepth 1 -not -name Tux.png -print0 | 
    xargs -0 mv -t ~/Linux/New

-maxdepth 1यह पुनरावर्ती खोज नहीं करता है। यदि आप केवल फाइलों की परवाह करते हैं, तो आप कह सकते हैं -type f-mindepth 1यह ~/Linux/Oldपरिणाम में स्वयं पथ शामिल नहीं करता है । किसी भी फ़ाइलनाम के साथ काम करता है, जिसमें उन लोगों के साथ शामिल होते हैं जिनमें एम्बेडेड न्यूलाइन्स होते हैं।

एक टिप्पणी नोट करती है कि एमवी -tविकल्प शायद GNU एक्सटेंशन है। उन प्रणालियों के लिए जिनके पास यह नहीं है

find ~/Linux/Old -maxdepth 1 -mindepth 1 -not -name Tux.png \
    -exec mv '{}' ~/Linux/New \;

1
इसके बाद से यह एक शक्तिशाली उपकरण सीखने को प्रोत्साहित करता है, खोजें। नोट, व्हॉट्सएप की फाइलों के लिए यह अभ्यस्त काम नहीं है। "Find -print0 | xargs -0" पर विचार करें वरना xgogs को छोड़ दें: "[आपने जो कहा है] उसे ढूंढें -exec mv -t {} ~ / Linux / New \;"
जेसनस्मिथ

यदि आपके mv कमांड में -t विकल्प नहीं है, तो या तो "find ... -exec mv {} Linux / New \" का उपयोग करें; या "खोजें ... | xargs -I {} mv {} लिनक्स / नया"। -T विकल्प एक GNU एक्सटेंशन लगता है, जो लिनक्स के लिए ठीक है, लेकिन शायद कहीं और नहीं।
रोब कैनेडी

jhs, ओह मैं असफल। मैंने सोचा था कि xargs नए स्थानों पर नहीं बल्कि स्थानों पर विभाजित है। लगता है जैसे मैं "पढ़ें" :) बीमार इसे ठीक से यह उलझन
litb - Johannes Schaub

भयानक टिप के लिए बहुत धन्यवाद! मैं sth चुनने जा रहा था क्योंकि यह प्रश्न को लक्षित करता है। हालाँकि, मैं बाद में आपके आदेशों की उपयोगिता को समझ सकता हूं, इसलिए मुझे "खोज और xargs" रास्ता चुनना होगा। यह सिर्फ चट्टानों। धन्यवाद :)
Léo Léopold Hertz '

जटिल का रास्ता। मासी का उत्तर अधिक पूर्ण, आसान और अधिक सही है
user637338

30

एक त्वरित तरीका टक्स फ़ाइल नाम को संशोधित करना होगा ताकि आपकी चाल कमांड मेल न खाए।

उदाहरण के लिए:

mv Tux.png .Tux.png

mv * ~/somefolder

mv .Tux.png Tux.png

उपयोग नहीं करते " ", के रूप में है कि केवल है कि एक फ़ाइलों को स्थानांतरित करेंगे। "" नाम में। बस "*" पर्याप्त है।
जूलियानो

1
यदि आप इसे * में बदलते हैं तो यह आपकी नामांकित फ़ाइल को भी हटा देगा।
जॉन टी

6
@ जॉन टी: नहीं, * ग्लोब उन फाइलों से मेल नहीं खाता है जो डॉट से शुरू होती हैं।
बिल कार्विन

यह अब तक का सबसे अच्छा जवाब है। इस उत्तर को बदलने या टिप्पणी करने की आवश्यकता नहीं है। 100 अंक। बहुत बहुत धन्यवाद। बहुत बढ़िया!
स्टीव के

23

मुझे लगता है कि बैक करने के लिए सबसे आसान तरीका है

mv `ls -1 ~/Linux/Old/ | grep -v Tux.png` ~/Linux/New/

संपादित करें:

इसके बजाय एलआईएस के साथ उपयोग करने से रोकने के लिए एलएस के साथ बैकस्लैश का उपयोग करें, यानी ज्यादातर एलएस को एलएस - रंग के रूप में अलियास किया जाता है।

mv `\ls -1 ~/Linux/Old/ | grep -v Tux.png` ~/Linux/New/

धन्यवाद @ अरनॉल्ड रोआ


1
क्या आप बता सकते हैं कि आप grep -vवहां क्यों उपयोग करते हैं?
लेओ लेपोल्ड हर्ट्ज़ '

1
gvp में -v विकल्प परिणाम को बाहर कर देता है, यह Tux.png को छोड़कर सब कुछ लेने जैसा है
Rohail Abbas

1
यह निश्चित रूप से सहज है, लेकिन ऊपर दिए गए उत्तर बेहतर हैं। यदि आप एक स्क्रिप्ट लिख रहे हैं, उदाहरण के लिए, यह आपको सही निर्देशिका में होना चाहिए ..
nJGL

@nJGL हम यहां पर पूर्ण पथ दे सकते हैं, मैंने होमडायरेक्टरी (~) का उपयोग किया क्योंकि प्रश्न में यह था
रोहेल अब्बास

@RohailAbbas मेला काफी ✌️
nJGL

14

बैश के लिए, sth उत्तर सही है। यहाँ zsh (पसंद का मेरा शेल) सिंटैक्स है:

mv ~/Linux/Old/^Tux.png ~/Linux/New/

EXTENDED_GLOBसेट करने के लिए शेल विकल्प की आवश्यकता होती है ।


3
क्या होगा अगर हम दो फ़ाइलों को बाहर करना चाहते हैं?
मपेन

13

मुझे यह थोड़ा सुरक्षित और आसान लगता है कि कुछ फ़ाइलों या निर्देशिकाओं को छोड़कर सरल चालों पर भरोसा करना आसान है।

ls -1 | grep -v ^$EXCLUDE | xargs -I{} mv {} $TARGET

यह बिजीबॉक्स / ASH
स्टुअर्ट कार्डल

1
इसने मेरे लिए उस स्थिति में काम किया जहां मुझे कुछ फाइलों को छोड़कर सभी फाइलों को एक अन्य निर्देशिका में स्थानांतरित करना पड़ा
उमर हयात

कमांड लाइन पर बहुत सारी अप्रासंगिक जानकारी शामिल -lकरने का विकल्प lsऔर एमवी कमांड की विफलता के परिणामस्वरूप होगा।
jdhao

5

निम्नलिखित 100% गारंटीकृत विधि नहीं है, और स्क्रिप्टिंग के लिए बिल्कुल भी प्रयास नहीं किया जाना चाहिए। लेकिन कुछ समय यह त्वरित इंटरैक्टिव शेल उपयोग के लिए पर्याप्त है। एक फ़ाइल फ़ाइल ग्लोब की तरह

[abc]*

(जो एक, बी या सी के साथ शुरू होने वाले नामों के साथ सभी फाइलों का मिलान करेगा, पहले "^" अक्षर को सम्मिलित करके नकारात्मक हो सकता है, अर्थात

[^abc]*

मैं कभी-कभी "खोई हुई + मिली" निर्देशिका के मिलान के लिए इसका उपयोग करता हूं, उदाहरण के लिए:

mv /mnt/usbdisk/[^l]* /home/user/stuff/.

बेशक अगर एल के साथ शुरू होने वाली अन्य फाइलें हैं तो मुझे बाद में उन पर कार्रवाई करनी होगी।


4
mv `find Linux/Old '!' -type d | fgrep -v Tux.png` Linux/New

खोज आदेश सभी नियमित फ़ाइलों को सूचीबद्ध करता है और fgrep कमांड किसी भी Tux.png को फ़िल्टर करता है। बैकटिक्स परिणामी फ़ाइल सूची को स्थानांतरित करने के लिए mv को बताता है।


4
कभी भी, कभी भी, एक अन्य कमांड के लिए तर्क के रूप में मूल्यांकन करें। बुरी बातें होंगी। आपने अभी एक भेद्यता पैदा की होगी। हमेशा खोज का उपयोग करें -प्रिंट0 | xargs -0 निर्माण, या ढूँढें -exec।
जूलियानो

3

कैसे के बारे में आप फ़ोल्डर में सब कुछ ले जाएँ और फिर Tux.png वापस ले जाएँ?

मैं "सब कुछ छोड़कर ..." कहने के लिए किसी भी शेल सिंटैक्स के बारे में नहीं सोच सकता।


3
ls ~/Linux/Old/ | grep -v Tux.png | xargs -i {} mv ~/Linux/New/'

1
यह आदेश एक भाग से गायब लगता है और मेरे कंप्यूटर में काम नहीं करता है। ls ~/Linux/Old/ | grep -v Tux.png | xargs -I{} mv {} ~/Linux/New/इसके बजाय काम करता है।
कैथरीन चेन

3

कैसा रहेगा:

mv $(echo * | sed s:Tux.png::g) ~/Linux/New/

आपको हालांकि फ़ोल्डर में रहना होगा।



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