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