2009-06-11 12 views
6

मेरे वेब एप्लिकेशन में मैं PHP स्क्रिप्ट का उपयोग कर पेज प्रस्तुत करता हूं, और फिर उनसे स्थिर HTML फ़ाइलों को उत्पन्न करता हूं। प्रदर्शन को तेज करने के लिए उपयोगकर्ताओं को स्थिर एचटीएमएल परोसा जाता है। अंततः एचटीएमएल फाइलें बदबू आ रही हैं, और उन्हें हटाने की जरूरत है।जो तेज़ है, 'find -exec' या 'find | xargs -0 '?

मैं तरीके बेदखली स्क्रिप्ट लिखने के लिए दोनों के बीच बहस कर रहा हूँ।

पहले एक भी खोजने के आदेश की तरह

find /var/www/cache -type f -mmin +10 -print0 | xargs -0 rm 
प्रत्येक फाइल यह पाता है के लिए

प्रथम रूप का आह्वान rm कुछ उपयोग कर रहा है, जैसे

find /var/www/cache -type f -mmin +10 -exec rm \{} \; 

दूसरा रूप xargs के माध्यम से पाइप के द्वारा होता है, जबकि दूसरा फॉर्म सिर्फ सभी फ़ाइल नामों को एक rm पर भेजता है (लेकिन फ़ाइल सूची बहुत लंबी हो सकती है)।

कौन सा फॉर्म तेजी से होगा?

मेरे मामले में, कैश निर्देशिका कुछ वेब सर्वरों के बीच साझा की जाती है, इसलिए यह सब एनएफएस पर किया जाता है, अगर यह इस मुद्दे के लिए मायने रखता है।

उत्तर

6

मैं आप प्रत्येक फ़ाइल नाम के लिए एक प्रक्रिया को उत्पन्न करने के रूप में नहीं कर रहे हैं xargs संस्करण तेजी से थोड़ा होने की उम्मीद। लेकिन, अगर आश्चर्य में वास्तव में बहुत अंतर था तो मुझे आश्चर्य होगा। यदि आप लंबी सूची के बारे में चिंतित हैं xargs आरएम के प्रत्येक आमंत्रण को भेजता है, तो आप इसका उपयोग कर सकने वाले टोकन की संख्या को सीमित करने के लिए xargs के साथ -l का उपयोग कर सकते हैं। हालांकि, xargs सबसे लंबी cmdline लंबाई जानता है और उससे परे नहीं होगा।

+3

मुझे लगता है कि xargs स्वचालित रूप से (बिना -एल) कई प्रक्रियाओं को जन्म देगा यदि तर्क की संख्या अधिकतम शेल से अधिक है। – MatthieuP

+0

धन्यवाद। मुझे नहीं पता था कि xargs ऐसा कर सकते हैं। – yhager

13

xargs संस्करण -exec संस्करण की तुलना में फ़ाइलों का एक बहुत कुछ के साथ नाटकीय रूप तेजी से होता है के रूप में आप यह पोस्ट, इस वजह rm प्रत्येक फ़ाइल आप निकालना चाहते हैं के लिए एक बार क्रियान्वित किया जाता है, जबकि xargs के रूप में कई फ़ाइलों रख कर देखेंगे एक साथ rm कमांड में संभव है।

दसियों या सैकड़ों हजारों फाइलों के साथ, यह एक घंटे या उससे कम समय के बीच एक मिनट के बेहतर अंतर के बीच अंतर हो सकता है।

आप "\" "के बजाय" + "के साथ कमांड को समाप्त करके -exec के साथ समान व्यवहार प्राप्त कर सकते हैं। यह विकल्प केवल find के नए संस्करणों में उपलब्ध है।

निम्न दो बराबर हैं:

find . -print0 | xargs -0 rm 
find . -exec rm \{} + 

ध्यान दें कि xargs संस्करण अभी भी थोड़ा तेज (कुछ प्रतिशत से) एक मल्टी-प्रोसेसर सिस्टम पर, चलेंगे क्योंकि काम के कुछ parallelized किया जा सकता। यह विशेष रूप से सच है यदि बहुत अधिक गणना शामिल है।

+1

मुझे xargs जाने का एक तेज़ तरीका मिला। मैं लगभग 250 घंटे की फाइलों के माध्यम से लगभग दो घंटे ले रहा हूं। तब मैंने इस एसओ पर ठोकर खाई और xargs की कोशिश की। एक चैंप की तरह आधे घंटे में 750,000 शेष शेष! – bbbco

+0

'-exec ...+ 'खोज 'के लिए POSIX मानक का हिस्सा है; इसके लिए समर्थन काफी व्यापक होना चाहिए। – chepner

2

खोज आदेश एक -delete विकल्प में builtin है, शायद वह भी उपयोगी हो सकता है? http://lists.freebsd.org/pipermail/freebsd-questions/2004-July/051768.html

+0

अच्छा, धन्यवाद। मैंने मैन पेज को देखा, और वहां एक चेतावनी है जिसे किसी भी व्यक्ति का उपयोग करना चाहता है - खोजने के साथ डिलीट विकल्प। मैं इसे यहां पेस्ट नहीं कर सकता, लेकिन उस आदमी को ध्यान से पढ़ना सुनिश्चित करें। – yhager

संबंधित मुद्दे