यहाँ एक सुरक्षित तरीका है:
grep -lrIZ foo . | xargs -0 rm -f --
-l
प्रिंट पैटर्न खोज से मेल खाती फाइलों के नाम दर्ज करता है।
-r
foo
दिए गए निर्देशिका में पैटर्न के लिए एक पुनरावर्ती खोज करता है .
। यदि यह काम नहीं करता है, तो प्रयास करें -R
।
-I
(पूंजी i
) पीडीएफ की तरह बाइनरी फ़ाइलों को छोड़ दिया जाता है।
-Z
यह सुनिश्चित करता है कि फ़ाइल नाम शून्य हैं (यानी, nul-) को समाप्त कर दिया गया है ताकि सफेद स्थान वाले नाम की गलत तरीके से व्याख्या न हो (यानी, एक के बजाय कई नाम)।
xargs -0
शून्य (nul) बाइट्स द्वारा शब्दों को अलग grep
करने से फ़ाइल नामों को खिलाता rm -f
है ( -Z
से विकल्प याद रखें grep
)।
--
अक्सर भूल जाता है लेकिन विकल्पों के अंत को चिह्नित करना और उन फ़ाइलों को हटाने की अनुमति देना बहुत महत्वपूर्ण है जिनके नाम के साथ शुरू होता है -
।
यदि आप यह देखना चाहते हैं कि कौन सी फाइलें डिलीट होने वाली हैं, तो केवल उस | xargs -0 rm -f --
हिस्से को हटा दें , और Z
विकल्प को छोड़ दें grep
।
एक अन्य उपयोगकर्ता ने निम्नलिखित की तरह कुछ सुझाया, जिसे आपको असुरक्षित नहीं होना चाहिए :
files=`grep foo * | cut -d: -f1`
rm -f $files # unsafe, do not run it!
अगर मेरे पास ऐसी फाइलें हैं, ImportantStuff
जिन्हें मैं हटाना नहीं चाहता और obsolete ImportantStuff
शामिल करना चाहता foo
हूं, तो मैं इस कमांड को चलाने के दौरान ImportantStuff
(और नहीं obsolete ImportantStuff
!) खो देता हूं, क्योंकि $files
इसकी व्याख्या होने पर रिक्त स्थान टूट जाता है। इस तरह से स्केलर शेल चर में फ़ाइलनाम की सूची डालना खतरनाक है।