नाम में स्ट्रिंग के बिना फ़ाइलें निकालें


9

मैं उन फाइलों को हटाना चाहता हूं जिनके नाम में स्ट्रिंग '999' ('बिना') नहीं है।

मैंने कोशिश की है:

grep -vlr 999 . | xargs -0 rm -f --
find . -print0 | grep --null-data -v 999 | xargs -0 rm --

लेकिन उनमें से कोई भी काम नहीं करता है। मैं बैश के साथ macOS सिएरा का उपयोग कर रहा हूं: 3.2.57।


2
grep -lफ़ाइलों जहां एक मैच मिला था (या के साथ नहीं मिला सूची यह कारण बनता -vमें) सामग्री , नहीं फ़ाइल नाम। grepहमेशा आपके द्वारा निर्दिष्ट फ़ाइलों की सामग्री के साथ मेल खाता है, उनके नाम कभी नहीं।
जोएल

जवाबों:


18

में एक विस्तारित ग्लोबिंग पैटर्न का उपयोग करना bash:

rm ./!(*999*)

इसके लिए shopt -s extglobसक्षम होना चाहिए (और सुरक्षा के लिए भी shopt -s failglob, ताकि !(*999*)सभी फ़ाइल नाम होने पर असामान्य नाम वाली कोई फ़ाइल गलती से न निकले 999)। पैटर्न !(*999*)मौजूदा निर्देशिका में किसी भी नाम से मेल खाएगा, उन नामों को छोड़कर *999*। छिपी हुई फ़ाइलों को हटाने के लिए (फाइलें जिनका नाम डॉट से शुरू होता है ), dotglobविकल्प को भी सक्षम करें ।

केवल नियमित फ़ाइलों या प्रतीकात्मक लिंक के बारे में नियमित फ़ाइलों की परवाह करने के लिए (निर्देशिका आदि नहीं):

for name in ./!(*999*); do [ -f "$name" ] && rm "$name"; done

zshऊपर पाश के लिए खोल बराबर होगा

rm ./(^(*999*))(.)

आपकी पहली कमांड तब काम नहीं grepकरेगी जब आप फाइलों के अंदर देखेंगे। यह उन सभी फ़ाइलों को हटा देगा जिनके बिना लाइनें 999हैं (क्या आपने --nullविकल्प जोड़ा है इसलिए यह साथ काम करता है xargs -0)।

आपका दूसरा कमांड तब से काम नहीं करेगा क्योंकि grepmacOS सपोर्ट नहीं करता है --null-data(इसका हालांकि कोई --nullविकल्प नहीं है, लेकिन केवल फाइलनेम आउटपुट जेनरेट करने के लिए)। यह भी ध्यान दें कि यह 999फ़ाइल के पथ (निर्देशिका घटकों सहित) में कहीं भी दिखाई देगा , न केवल फ़ाइल का नाम।


1
आप failglobविकल्प को सक्षम करना चाहते हैं या यह फ़ाइल को हटाने को समाप्त कर सकते हैं, !(*999*)अगर कोई अन्य फ़ाइल नहीं है जिसका नाम नहीं है 999
स्टीफन चेज़लस

16

बस नाम की हालत में पलटना find:

find . -type f \! -name "*999*" 

जोड़ें -deleteया -exec rm {} +वास्तव में मिलान की गई फ़ाइलों को निकालने के लिए।


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