फ़ाइलों और निर्देशिकाओं को पुनरावर्ती रूप से निकालने के लिए rm का उपयोग करें


17

फ़ाइलों और निर्देशिकाओं को हटाने के लिए rm का उपयोग करना संभव है अन्य पैटर्न का उपयोग किए बिना एक पैटर्न के पुनरावर्ती मिलान?

जवाबों:


35

अपने प्रश्न का सीधे उत्तर देने के लिए, "नहीं - आप वह नहीं कर सकते जो आप वर्णन करते हैं rm"।

आप कर सकते हैं , हालांकि, यह आप के साथ संयोजित करना find। यहाँ कई तरीकों में से एक है जो आप कर सकते हैं:

 # search for everything in this tree, search for the file pattern, pipe to rm
 find . | grep <pattern> | xargs rm

उदाहरण के लिए, यदि आप सभी * ~ फ़ाइलों को nuke करना चाहते हैं, तो आप ऐसा कर सकते हैं:

 # the $ anchors the grep search to the last character on the line
 find . -type f | grep '~'$ | xargs rm

एक टिप्पणी से विस्तार करने के लिए * :

 # this will handle spaces of funky characters in file names
 find -type f -name '*~' -print0 | xargs -0 rm

1
सच है - यदि आप अंतिम पाइप को छोड़ देते हैं, तो आपको पहले सब कुछ की एक सूची मिल जाएगी :)
वॉरेन

2
सीधे तौर पर पोस्टर के सवाल का जवाब नहीं दिया जा सकता है, लेकिन सबसे करीब वे हैं जो वे चाहते हैं।
Drakia

1
एक बौना, कि कोई कारण नहीं के लिए थोड़ा कड़वा है?
16

10
कृपया उपयोग करने में बहुत सावधानी बरतें find | grep | xargs rm। यदि रिक्त स्थान (या newlines) के साथ फ़ाइलें हैं, तो यह टूट जाएगा (और फ़ाइल नाम और जहां स्थान हैं) के आधार पर सामान को हटा सकते हैं जिसे आपने हटाने का इरादा नहीं किया था। find … -print0 | xargs -0 rmऔर अधिक मजबूत होगा। हालांकि, इसका मतलब यह होगा कि आप उपयोग नहीं कर सकते हैं grepऔर findकेवल वांछित फ़ाइलों के मिलान और प्रिंट करने के लिए विधेय का उपयोग करना चाहिए । वारेन का दूसरा उदाहरण अधिक मजबूत होगा find -type f -name '*~' -print0 | xargs -0 rm
क्रिस जॉन्सन

1
यदि आप एक ही काम करना चाहते हैं, तो दिए गए आदेशों में से एक का उपयोग करके एक उपनाम बनाएं। यदि वांछित है, तो बाद में इसके लिए एक जवाब भरेंगे।
आकस्मिक वीरवार 18

8

"अन्य आदेशों का उपयोग किए बिना"

नहीं।


अच्छा जवाब "प्रारंभिक प्रश्न का सख्ती से उत्तर दें (समाधान प्रदान करने में सक्षम नहीं होने के जोखिम पर)" बनाम "एक समाधान प्रदान करते हैं, भले ही यह कड़ाई से लगाए गए प्रतिबंधों से मेल नहीं खाता हो" बहस।
16

मैंने केवल इसे "ए बौना" के रूप में पोस्ट किया था जो उस जवाब के बारे में शिकायत कर रहा था जो वास्तव में एक समाधान प्रदान करता था। अन्य आदेशों का उपयोग किए बिना वास्तव में पुनरावर्ती फ़ाइल विलोपन करने का कोई तरीका नहीं है जो एक पैटर्न से मेल खाता है, बस वर्तमान-निर्देशिका फ़ाइल / निर्देशिका विलोपन।
ढकिया

3

globstarसेट के साथ बैश का उपयोग करना , हाँ :

rm basedir/**/my*pattern*

आपके द्वारा मेल की जाने वाली फ़ाइलों को सूचीबद्ध करने ls -1से पहले इसे पहले उदाहरण के साथ आज़माएं rm

आप उदाहरण के माध्यम से विकल्प सेट करें shopt -s globstar


वैकल्पिक रूप से, एक छोटा findसंस्करण:

find -type f -name 'my*pattern*' -delete

या GNU के लिए find:

find -type f -name 'my*pattern*' -exec rm {} +

या गैर-जीएनयू find(थोड़ा धीमा) के लिए एक और विकल्प :

find -type f -name 'my*pattern*' -exec rm {} \;

भी, निर्देशिका को दूर के रूप में आप के लिए पूछने के लिए: बस परिवर्तन rmमें rm -rऊपर बताए गए आदेशों में और केवल पर मिलान को छोड़ -type fमें findआदेशों।


0

मैंने "rm -rf" का पता लगा लिया है, जहाँ फ़ाइल नाम और मिलान पैटर्न जैसे * और? आदि (जैसे Todays_log_2009 ????। लॉग)। यह वर्तमान डिर से शुरू होगा और उस पैटर्न को हटाने वाली फ़ाइलों को पुन: हटाने का काम करेगा।


यह काम नहीं करेगा क्योंकि वर्तमान निर्देशिका में शेल द्वारा पैटर्न का विस्तार किया गया है। यदि उद्धृत किया जाता है, तो पैटर्न इसमें विशेष पात्रों के साथ एक फ़ाइल नाम बन जाता है। फ़ाइल को हटाने के लिए उदाहरण के लिए, कोई rm '[' लिख सकता है। पैटर्न बस अपना अर्थ खो देता है।
आकस्मिक

0

यदि आप zsh (1) का उपयोग करते हैं, तो .zshrc के साथ "विस्तारित ग्लोबिंग " चालू करें setopt extendedglob। '** /' के साथ पैटर्न को फिर से बनाना, फिर से हटाना होगा:

% rm -rf ** / <पैटर्न>

हालाँकि, यदि हटाने के लिए बहुत सारी फाइलें हैं, तो आपको xargs (1) या -exec के साथ खोजने के लिए (1) का सहारा लेना चाहिए , और मैं शेल स्क्रिप्ट में भी ऐसा करने की सलाह देता हूं।

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