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


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.