X, Y और Z फ़ाइलों को छोड़कर किसी फ़ोल्डर में सभी फ़ाइलों को हटाना


17

मेरे पास एक विशिष्ट फ़ोल्डर में बहुत सारी फाइलें और फ़ोल्डर हैं और मैं उन सभी को हटाना चाहता हूं; हालाँकि, मैं फ़ाइलें X, Y और Z रखना चाहता था।

क्या कोई तरीका है जिससे मैं कुछ कर सकता हूं: rm * | but NOT grep | X or Y or Z


मुझे लगता है कि मैं इसमें कुछ नियमित अभिव्यक्ति का उपयोग कर सकता हूं जो ऐसा करेगा?
अमित

जवाबों:


16

आरएम का उपयोग करने के बजाय, खोजने में उपयोग करना आसान हो सकता है । इस तरह एक कमांड 'फ़ाइल' नाम की फ़ाइल को छोड़कर सब कुछ हटा देगा

find . \! -name 'file' -delete

कई संस्करणों को ग्लोबिंग और नियमित अभिव्यक्ति मिलान का समर्थन करने में सक्षम होना चाहिए।

तुम भी rm के रूप में अच्छी तरह से खोजने के उत्पादन को पाइप कर सकते हैं

find . \! -name '*pattern*' -print0 | xargs --null rm 

3
और यह आप देख वास्तव में क्या फ़ाइलों को हटाने के द्वारा हटा दिया जाएगा सुविधा देता है -deleteऔर साथ ही करके फ़ाइलें क्या सहेजा जाएगा दूर करने -deleteऔर \!
शॉन जे। गोफ

1
सावधान, findपुनरावर्ती है! इसलिए सभी फ़ाइल उपनिर्देशिकाएं ' पैटर्न ' से मेल नहीं खा रही हैं और साथ ही डिलीट हो जाएंगी
अलेक्जेंड्रे होल्डन डेल

जिस तरह से xargs की ज़रूरत होती है -depth, उनमें शामिल फ़ाइलों से पहले निर्देशिकाओं को हटाने की कोशिश को रोकने के लिए। हालाँकि, मुझे लगता है कि rm डायरेक्ट्रीज़ को भी नहीं हटाएगा।
उपयोगकर्ता अज्ञात

9

, Zsh का उपयोग के साथ setopt EXTENDED_GLOB, का उपयोग करते हुए ~ऑपरेटर ( छोड़कर )

rm -- *~(x|y|z)

या ^ऑपरेटर (निषेध):

rm -- ^(x|y|z)

लेकिन, आपको संभवतः फाइलों को कहीं और स्थानांतरित करना चाहिए, फिर सब कुछ हटा दें। यह उंगली फिसलने के मामले में बहुत सुरक्षित है, जैसे कि बहुत जल्द ही प्रवेश करना।


5

बैश के बाद के संस्करणों में extglobशेल विकल्प होता है जो आपको वही करने के लिए एक सिंटैक्स प्रदान करता है जो आप चाहते हैं (अपने मैन पेज को "पाथनाम एक्सपेंशन" के तहत जांचें कि क्या आपके इंस्टॉल किए गए संस्करण में यह देखने के लिए है):

$ shopt -s extglob  # turn on extended globbing
$ rm !(X|Y|Z)

परीक्षण करने के लिए, मैं सुझाव है कि आप पहले की जगह rmके साथ echoकरता है, तो फ़ाइलों की सूची से हटाया जाने वाला आप क्या अपेक्षा है देखने के लिए।


5
ls -1 | grep -v "^[XYZ]$" # | xargs rm -r

ध्यान दें: कमांड चलाएँ और यदि डिलीट की जाने वाली फाइलें सही हैं, तो इसे फिर से चलाएँ और हैश कैरेक्टर "#" को हटा दें।

यदि फ़ाइल नाम अधिक जटिल हैं, तो ऐसा करें

ls -1 | egrep -v "^file1$|^filename2$|^f1le$" # | xargs rm -r

फिर से, पहले परिणाम देखें फिर हैश साइन को हटा दें।

यह संस्करण - जैसा कि टिप्पणियों में सुझाया गया है - कुछ पात्रों को बचाता है और थोड़ा स्पष्ट दिखता है।

ls -1 | egrep -v "^(file1|filename2|f1le)$" # | xargs rm -r

एक सुझाव संपादित करें द्वारा ddeimeke बदलने के लिए है egrepकरने के लिए तर्क"^(file1|filename2|f1le)$"
माइकल Mrozek

यदि आपके पास तीन फ़ाइलें हैं a, bऔर a bपहला प्रोग्राम हटा देगा - यदि आप grep भाग में ab डालते हैं: "^[ab]$" aऔर bनहीं a b, तो बस अपने इरादों के विपरीत। दूसरा कमांड वही करेगा। और तीसरा भी। आपको लिपियों में 'ls' का उपयोग नहीं करना चाहिए, बहुत ही दुर्लभ अपवादों के साथ। बस यह मत करो।
उपयोगकर्ता अनजान

3

उन फ़ाइलों को स्थानांतरित करें जिन्हें आप दूर रखना चाहते हैं। एक स्तर ऊपर जाएं, फ़ोल्डर हटाएं। फ़ोल्डर को फिर से बनाएँ और उन फ़ाइलों को वापस ले जाएँ।


मुझे आश्चर्य है कि माइनस क्यों? .. यह वास्तव में दूसरों द्वारा प्रस्तावित किसी भी चीज़ की तुलना में आसान और सुरक्षित है: आप केवल फ़ाइल नाम में कुछ विशेष चार को मारकर अपने आप को एक पैर में गोली नहीं मार सकते।
एलेक्स

a) आप अपनी फ़ाइल X एक निर्देशिका को ऊपर ले जाते हैं, जहाँ एक फ़ाइल X मौजूद है - चुपचाप हटा दिया गया, चला गया। b) आप शीर्ष dir में हैं, जहाँ कोई 'up' मौजूद नहीं है। ग) आप अपने घर में हैं, और आपके पास / घर पर लिखने की अनुमति नहीं है। यदि आप अपनी सलाह को एक स्क्रिप्ट में रखते हैं, और इसे समस्या के बिना परीक्षण किया है, और ऐसी स्थिति में उपयोग करें - पेंग!
उपयोगकर्ता अज्ञात

2
a) अरे, मैंने कहा था 'फाइल को एक स्तर ऊपर ले जाना '? मैंने कहा है उन्हें दूर हटो। बी) तो आप में सभी फ़ाइलों को हटाने की कोशिश कर रहे हैं /, हे? बहुत व्यावहारिक नहीं है। ग) आपके सभी फाइलों को हटाने की कोशिश करना $HOMEवास्तव में व्यावहारिक नहीं है।
एलेक्स

आप सही हैं, मुझे क्षमा करें।
उपयोगकर्ता अज्ञात

0

यह वही है जो मैंने OSX / MacOS लॉगआउट हुक के लिए एक .sh स्क्रिप्ट के रूप में सेट किया है, काफी अच्छी तरह से काम करता है।

#! /bin/bash
for dir in /PathToFolder/*
 do
    if [ ! "$dir" = "/PathToFolder/FolderToKeep1" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep2" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep3" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep4" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep5" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep6" ] ; then 
      echo ${dir}
      sudo rm -R $dir user
      dscl . -delete $dir
    fi 
  done

exit 0

0

GNU- खोजने से आप -delete स्विच का उपयोग कर सकते हैं, जो निर्देशिकाओं को हटा देता है, यदि खाली हो, तो:

 find tmp -not -name X -not -name Y -not -name Z -delete 

यदि X, Y या Z एक निर्देशिका है, तो यह उनके अंदर की फ़ाइलों को भी हटा देगा। find tmp -maxdepth 1 -not -name X -not -name Y -not -name Z -deleteइस के आसपास काम करने का एक तरीका है।
गिल्स एसओ- बुराई को रोकें '

चूंकि यूनिक्स के तहत फ़ोल्डर्स फाइलें हैं (कुछ भी एक फाइल है), शायद यही इरादा है। प्रश्न स्पष्ट रूप से कहता है: "मेरे पास एक विशिष्ट फ़ोल्डर में बहुत सारी फाइलें और फ़ोल्डर हैं और मैं उन सभी को हटाना चाहता हूं" - और यदि आप वाई को बाहर करना पसंद करते हैं, तो शायद आप जानते हैं कि वाई एक निर्देशिका है या नहीं।
उपयोगकर्ता अनजान

tmpयदि कोई X/ Y/ Zफ़ाइलें नहीं थीं, तो वह भी समाप्त हो जाएंगी । !जीएनयू के मानक समकक्ष के रूप में ध्यान दें -not( -deleteयह भी एक जीएनयू एक्सटेंशन है)
स्टीफन चेज़लस

@ स्टीफनचेज़ेलस: इस सवाल से, फ़ोल्डर्स को हटाना (उन सभी को) जो पूछा गया था। चूंकि बैंग को मास्किंग की आवश्यकता होती है, इसलिए मैं टाइपिंग-नोट पसंद करता हूं। जर्मन कीबोर्ड लेआउट पर निर्भर हो सकता है, जहां बैकस्लैश को Alt-Gr की आवश्यकता होती है।
उपयोगकर्ता अज्ञात
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.