यह ज्यादातर ऑफ-टॉपिक है, लेकिन आप इसका उपयोग कर सकते हैं
find -maxdepth 1 -type f -name '*.txt' | xargs python -c '
import fileinput
for line in fileinput.input(inplace=True):
print line.replace("blah", "blee"),
'
यहां मुख्य लाभ (ओवर ... xargs ... -I {} ... sed ...
) गति है: आप sed
10 मिलियन बार निवेश करने से बचते हैं । यह तब भी तेज़ होगा जब आप पायथन का उपयोग करने से बच सकते थे (चूँकि अजगर धीमे, अपेक्षाकृत प्रकार का है), इसलिए पर्ल इस कार्य के लिए बेहतर विकल्प हो सकता है। मुझे यकीन नहीं है कि पर्ल के साथ आसानी से समकक्ष कैसे किया जाए।
जिस तरह से यह काम करता है, वह xargs
पायथन को कई तर्कों के साथ आमंत्रित करेगा, क्योंकि यह एक ही कमांड लाइन पर फिट हो सकता है, और ऐसा तब तक करता रहेगा जब तक कि यह तर्कों से बाहर नहीं निकलता (जो कि आपूर्ति की जा रही है ls -f *.txt
)। प्रत्येक आह्वान के तर्कों की संख्या फिलानेम की लंबाई और um, कुछ अन्य सामान पर निर्भर करेगी। fileinput.input
समारोह प्रत्येक मंगलाचरण के तर्कों में नामित फ़ाइलों से लगातार लाइनों पैदावार, और inplace
विकल्प यह जादुई "पकड़" उत्पादन के लिए और इसका इस्तेमाल प्रत्येक पंक्ति को बदलने के लिए कहता है।
ध्यान दें कि पायथन की स्ट्रिंग replace
विधि regexps का उपयोग नहीं करती है; यदि आपको जरूरत है, तो आपको इनका import re
उपयोग करना होगा print re.sub(line, "blah", "blee")
। वे पर्ल-कम्पेटिबल रेग्जैम्प्स हैं, जो आपके साथ मिलने वाले भारी फोर्टिफाइड संस्करणों की तरह हैं sed -r
।
संपादित करें
जैसा कि अकीरा ने टिप्पणी में उल्लेख किया है, कमांड के ls -f *.txt
स्थान पर ग्लोब ( ) का उपयोग करने वाला मूल संस्करण find
काम नहीं करेगा क्योंकि ग्लब्स को शेल ( bash
) द्वारा ही संसाधित किया जाता है। इसका मतलब यह है कि कमांड चलाने से पहले, 10 मिलियन फ़ाइलनाम को कमांड लाइन में प्रतिस्थापित किया जाएगा। यह कमांड के तर्क सूची के अधिकतम आकार को पार करने के लिए बहुत अधिक गारंटी है। आप xargs --show-limits
इस पर सिस्टम-विशिष्ट जानकारी के लिए उपयोग कर सकते हैं ।
तर्क सूची के अधिकतम आकार को भी ध्यान में रखा जाता है xargs
, जो उस सीमा के अनुसार अजगर के प्रत्येक आह्वान को पारित करने वाले तर्कों की संख्या को सीमित करता है। चूँकि xargs
अभी भी कुछ समय के लिए अजगर को आमंत्रित करना होगा, अकीरा os.path.walk
को फाइल लिस्टिंग प्राप्त करने के लिए उपयोग करने का सुझाव शायद आपको कुछ समय बचाएगा।
sed
प्रत्येक फ़ाइल के लिए इनवॉइस करने से बच सकते हैं तो यह तेज़ होगा । मुझे यकीन नहीं है कि अगर फ़ाइलों की एक श्रृंखला को खोलने, संपादित करने, सहेजने और बंद करने का कोई तरीका हैsed
; यदि गति आवश्यक है, तो आप एक अलग कार्यक्रम, शायद पर्ल या अजगर का उपयोग करना चाहते हैं।