यहाँ एक उदाहरण है बैश स्क्रिप्ट:
#!/bin/bash
local LOCKFILE=/tmp/rmHugeNumberOfFiles.lock
# this process gets ultra-low priority
ionice -c2 -n7 -p $$ > /dev/null
if [ $? ]; then
echo "Could not set disk IO priority. Exiting..."
exit
fi
renice +19 -p $$ > /dev/null
if [ $? ]; then
echo "Could not renice process. Exiting..."
exit
fi
# check if there's an instance running already. If so--exit
if [ -e ${LOCKFILE} ] && kill -0 `cat ${LOCKFILE}`; then
echo "An instance of this script is already running."
exit
fi
# make sure the lockfile is removed when we exit. Then: claim the lock
trap "command rm -f -- $LOCKFILE; exit" INT TERM EXIT
echo $$ > $LOCKFILE
# also create a tempfile, and make sure that's removed too upon exit
tmp=$(tempfile) || exit
trap "command rm -f -- '$tmp'" INT TERM EXIT
# ----------------------------------------
# option 1
# ----------------------------------------
# find your specific files
find "$1" -type f [INSERT SPECIFIC SEARCH PATTERN HERE] > "$tmp"
cat $tmp | rm
# ----------------------------------------
# option 2
# ----------------------------------------
command rm -r "$1"
# remove the lockfile, tempfile
command rm -f -- "$tmp" $LOCKFILE
यह स्क्रिप्ट अपनी प्रक्रिया प्राथमिकता निर्धारित करके शुरू होती है और डिस्कओआई प्राथमिकता बहुत कम मानों के लिए प्राथमिकता है, यह सुनिश्चित करने के लिए कि अन्य चल रही प्रक्रियाएं यथासंभव अप्रभावित हैं।
फिर यह सुनिश्चित करता है कि यह केवल ऐसी प्रक्रिया चल रही है।
स्क्रिप्ट का मूल वास्तव में आपकी वरीयता पर निर्भर है। यदि आप सुनिश्चित हैं कि पूरे डीआईआर को अनिश्चित रूप से हटाया जा सकता है (विकल्प 2), या आप find
का उपयोग अधिक विशिष्ट फ़ाइल हटाना (विकल्प 1, संभवतः कमांड लाइन विकल्प "$ 2" और ऑनव सुविधा के लिए कर सकते हैं) के लिए कर सकते हैं।
ऊपर कार्यान्वयन में, विकल्प 1 (find
) पहले, एक tempfile के लिए सब कुछ आउटपुट ताकि rm
समारोह केवल एक बार बजाय find
द्वारा पाया प्रत्येक फ़ाइल के बाद कहा जाता है। जब फाइलों की संख्या वास्तव में बड़ी होती है, तो यह महत्वपूर्ण समय बचाने के लिए हो सकती है। डाउनसाइड पर, टेम्पफाइल का आकार एक मुद्दा बन सकता है, लेकिन यह केवल तभी संभव है जब आप सचमुच अरबों फाइलों को हटा रहे हों, प्लस, क्योंकि डिस्कियो की इतनी कम प्राथमिकता है, एक टेम्पफाइल का उपयोग करके rm
कुल मिलाकर हो सकता है find (...) -exec rm {} \;
विकल्प का उपयोग करने से धीमे रहें। हमेशा की तरह, आपको यह देखने के लिए थोड़ा सा प्रयोग करना चाहिए कि आपकी आवश्यकताओं के अनुरूप सबसे अच्छा क्या है।
संपादित करें: उपयोगकर्ता 946850 द्वारा सुझाए गए अनुसार, आप पूरे tempfile को भी छोड़ सकते हैं और find (...) -print0 | xargs -0 rm
का उपयोग कर सकते हैं। इसमें एक बड़ी मेमोरी पदचिह्न है, क्योंकि सभी मिलान करने वाली फ़ाइलों के सभी पूर्ण पथ रैम में डाले जाएंगे जब तक कि find
कमांड पूरी तरह से समाप्त नहीं हो जाता है। ऊपर की ओर: tempfile को लिखने के कारण कोई अतिरिक्त फ़ाइल IO नहीं है। कौन सा चयन करना आपके उपयोग-मामले पर निर्भर करता है।
स्रोत
2012-07-06 10:52:48
क्या, जल्दी होने के लिए स्थान बनाने या रास्ते से बाहर निर्देशिका हो रही की जरूरत है।यदि दूसरा, तो उन्हें 'एमवी' (बहुत तेज़), फिर इसे हटा दें। –