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