मेरे पास एक विशिष्ट फ़ोल्डर में बहुत सारी फाइलें और फ़ोल्डर हैं और मैं उन सभी को हटाना चाहता हूं; हालाँकि, मैं फ़ाइलें X, Y और Z रखना चाहता था।
क्या कोई तरीका है जिससे मैं कुछ कर सकता हूं: rm * | but NOT grep | X or Y or Z
मेरे पास एक विशिष्ट फ़ोल्डर में बहुत सारी फाइलें और फ़ोल्डर हैं और मैं उन सभी को हटाना चाहता हूं; हालाँकि, मैं फ़ाइलें X, Y और Z रखना चाहता था।
क्या कोई तरीका है जिससे मैं कुछ कर सकता हूं: rm * | but NOT grep | X or Y or Z
जवाबों:
आरएम का उपयोग करने के बजाय, खोजने में उपयोग करना आसान हो सकता है । इस तरह एक कमांड 'फ़ाइल' नाम की फ़ाइल को छोड़कर सब कुछ हटा देगा
find . \! -name 'file' -delete
कई संस्करणों को ग्लोबिंग और नियमित अभिव्यक्ति मिलान का समर्थन करने में सक्षम होना चाहिए।
तुम भी rm के रूप में अच्छी तरह से खोजने के उत्पादन को पाइप कर सकते हैं
find . \! -name '*pattern*' -print0 | xargs --null rm
-delete
और साथ ही करके फ़ाइलें क्या सहेजा जाएगा दूर करने -delete
और \!
।
find
पुनरावर्ती है! इसलिए सभी फ़ाइल उपनिर्देशिकाएं ' पैटर्न ' से मेल नहीं खा रही हैं और साथ ही डिलीट हो जाएंगी
, Zsh का उपयोग के साथ setopt EXTENDED_GLOB
, का उपयोग करते हुए ~
ऑपरेटर ( छोड़कर )
rm -- *~(x|y|z)
या ^
ऑपरेटर (निषेध):
rm -- ^(x|y|z)
लेकिन, आपको संभवतः फाइलों को कहीं और स्थानांतरित करना चाहिए, फिर सब कुछ हटा दें। यह उंगली फिसलने के मामले में बहुत सुरक्षित है, जैसे कि बहुत जल्द ही प्रवेश करना।
बैश के बाद के संस्करणों में extglob
शेल विकल्प होता है जो आपको वही करने के लिए एक सिंटैक्स प्रदान करता है जो आप चाहते हैं (अपने मैन पेज को "पाथनाम एक्सपेंशन" के तहत जांचें कि क्या आपके इंस्टॉल किए गए संस्करण में यह देखने के लिए है):
$ shopt -s extglob # turn on extended globbing
$ rm !(X|Y|Z)
परीक्षण करने के लिए, मैं सुझाव है कि आप पहले की जगह rm
के साथ echo
करता है, तो फ़ाइलों की सूची से हटाया जाने वाला आप क्या अपेक्षा है देखने के लिए।
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
egrep
करने के लिए तर्क"^(file1|filename2|f1le)$"
a
, b
और a b
पहला प्रोग्राम हटा देगा - यदि आप grep भाग में ab डालते हैं: "^[ab]$"
a
और b
नहीं a b
, तो बस अपने इरादों के विपरीत। दूसरा कमांड वही करेगा। और तीसरा भी। आपको लिपियों में 'ls' का उपयोग नहीं करना चाहिए, बहुत ही दुर्लभ अपवादों के साथ। बस यह मत करो।
उन फ़ाइलों को स्थानांतरित करें जिन्हें आप दूर रखना चाहते हैं। एक स्तर ऊपर जाएं, फ़ोल्डर हटाएं। फ़ोल्डर को फिर से बनाएँ और उन फ़ाइलों को वापस ले जाएँ।
/
, हे? बहुत व्यावहारिक नहीं है। ग) आपके सभी फाइलों को हटाने की कोशिश करना $HOME
वास्तव में व्यावहारिक नहीं है।
यह वही है जो मैंने 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
GNU- खोजने से आप -delete स्विच का उपयोग कर सकते हैं, जो निर्देशिकाओं को हटा देता है, यदि खाली हो, तो:
find tmp -not -name X -not -name Y -not -name Z -delete
find tmp -maxdepth 1 -not -name X -not -name Y -not -name Z -delete
इस के आसपास काम करने का एक तरीका है।
tmp
यदि कोई X
/ Y
/ Z
फ़ाइलें नहीं थीं, तो वह भी समाप्त हो जाएंगी । !
जीएनयू के मानक समकक्ष के रूप में ध्यान दें -not
( -delete
यह भी एक जीएनयू एक्सटेंशन है)