मैंने एक स्क्रिप्ट लिखी थी जो एक फ़ोल्डर में अंतिम दो फ़ाइलों को छोड़कर सभी को हटा देती है:
#!/bin/bash
ls -1 --quoting-style=shell-always /path/to/some/folder \
| head -n -2 \
| xargs printf -- "'/path/to/some/folder/%s'\n" \
| xargs sudo rm -rf
इस स्क्रिप्ट को हर दिन क्रोन जॉब के रूप में निष्पादित किया जाएगा।
तर्क इस प्रकार है:
सभी फ़ाइलों का उपयोग करके एक सूची प्राप्त करें
ls -1
(ताकि मुझे प्रति पंक्ति एक फ़ाइल मिल सके);अंतिम दो का उपयोग कर सूची से निकालें
head -n -2
;चूंकि
ls
सापेक्ष पथ प्रिंट करता है,xargs printf
फ़ोल्डर पथ को प्रीपेन्ड करने और इसे पूर्ण पथ बनाने के लिए चीज़ का उपयोग करें ;उन्हें
sudo rm -rf
उपयोग करने के लिए भेजेंxargs
।
इस फ़ोल्डर में सभी की पहुंच है, इसलिए कोई भी इस फ़ोल्डर में किसी भी फ़ाइल को बना और हटा सकता है।
समस्या यह है: sudo rm -rf
डरावना है। xargs sudo rm -rf
अविश्वसनीय रूप से डरावना है।
मैं यह सुनिश्चित करना चाहता हूं कि कोई भी अन्य फ़ोल्डर / सिस्टम को नष्ट करने के लिए चतुर फ़ाइलों को बनाने से नुकसान नहीं पहुंचा सकता है (या तो गलती से या उद्देश्य पर)। मुझे नहीं पता, जैसे कुछ चालाक:
file with / spaces.txt
जिसके परिणामस्वरूप एक सुपर डरावना हो सकता है sudo rm -rf /
।
संपादित करें: मेरी गलती, फ़ाइल नाम शामिल नहीं हो सकते हैं /
, इसलिए यह विशिष्ट समस्या नहीं होगी, लेकिन अन्य जोखिम अभी भी हैं या नहीं, इस बारे में सवाल।
यही कारण है कि मैं उपयोग कर रहा हूं --quoting-style=shell-always
, यह रिक्त स्थान के साथ फ़ाइलों के साथ किसी भी चाल को रोकना चाहिए। लेकिन अब मैं सोच रहा हूं कि क्या किसी को फ़ाइल नाम में रिक्त स्थान और उद्धरण के साथ अतिरिक्त चतुर हो सकता है ।
क्या मेरी स्क्रिप्ट सुरक्षित है?
नोट: मुझे आवश्यकता है sudo
क्योंकि मैं फ़ोल्डर को दूरस्थ रूप से (मैप्ड नेटवर्क ड्राइव का उपयोग करके mount
) स्वीकार कर रहा हूं, और मैं इसे sudo के बिना काम करने के लिए नहीं प्राप्त कर सका।
/
नाम में चरित्र के साथ एक फ़ाइल बनाई जा सकती है जिसे मैं यहाँ वापस हासिल करने की कोशिश कर रहा हूँ
ls
आउटपुट को पार्स कर रहे हैं यह पहले से ही एक खराब लिखित कमांड है, यहां तक कि उद्धरण के साथ भी। ls
मैं क्रमबद्ध करने के लिए लोकेल का भी उपयोग करता हूं, मुझे लगता है, इसलिए मैं यह नहीं देखता कि head
अंतिम 2 को हटाने का क्या उद्देश्य है (जब तक कि आप छुटकारा पाने की कोशिश नहीं कर रहे हैं .
और ..
जो कि iirc को rm
वैसे भी तर्क के रूप में अनुमति नहीं है। बस उपयोग करें find /path/to/folder -type f delete
। ... नहीं, sudo
अगर आप क्रोन से चलते हैं - क्रॉन पहले से ही जड़ स्तर पर है
printf -- '%s\0' /path/to/some/folder/* | head -zn -2 | xargs -0 rm
?