हाल ही में मुझे एक विशिष्ट पैटर्न से मेल खाते वाले निर्देशिका को छोड़कर सभी फ़ाइलों / फ़ोल्डरों को हटाने के कार्य का सामना करना पड़ा। इसलिए मैंने काम करने के लिए सिंगल-लाइन यूनिक्स कमांड को पकाया। क्या यह केवल एक पंक्ति होनी चाहिए? मुझे नहीं लगता, लेकिन यह निश्चित रूप से उस तरह से ठंडा है!
जबकि समस्या बहुत सरल है, मैं थोड़ा हैरान था कि मेरा समाधान कितना जटिल था। यहां मैंने जो कमांड इस्तेमाल किया है; नोट: यह एक खराब समाधान है क्योंकि यह फ़ाइल-नाम वाले वर्ण-वर्णों को नहीं संभालता है (जो मेरी स्थिति में कोई फर्क नहीं पड़ता)।
ls | grep -v PATTERN | xargs -n1 -IREPLACE rm -rf REPLACE
मैंने "खोज" कमांड का उपयोग नहीं किया क्योंकि मैं PATTERN से मेल खाने वाले फ़ोल्डरों में पुनरावृत्ति नहीं करना चाहता। उदाहरण के लिए, निम्नलिखित फ़ाइल संरचना पर विचार करें:
file_foo.txt
first_dir
|
+--> contents
+--> ...
foo_dir
|
+--> anotherfile.txt
+--> morefiles.log
foo_file.txt
somefile.txt
पैटर्न "foo" का उपयोग केवल "first_dir" (और यह निश्चित रूप से सामग्री) और "somefile.txt" (निकालना होगा नहीं "anotherfile.txt" या "morefiles.log")।
प्रश्न, क्या इसे पूरा करने के बेहतर (अधिक सुरुचिपूर्ण और सही) तरीके हैं?
संपादित करें:
यह हाल ही में मेरे ध्यान में लाया गया था कि "खोज" एक बेहतर विकल्प हो सकता है :
find * -maxdepth 0 ! -name PATTERN -print0 | xargs -0n1 rm -rf
यह समाधान लाइन-फीड वर्ण वाले पथ को सही ढंग से संभालता है।