आप ग्लोबस्टार का उपयोग कर सकते हैं।
साथ globstar
खोल विकल्प सक्षम, आप सभी की जरूरत है gzip -vk **/*.{css,html}
।
बैश शेल में एक globstar
विकल्प होता है जिससे आप पुनरावर्ती ग्लब्स को लिख सकते हैं **
। shopt -s globstar
सक्षम बनाता है। लेकिन आप ऐसा नहीं करना चाह सकते हैं कि बाद में आपके द्वारा चलाए जाने वाले अन्य आदेशों के लिए, इसलिए आप इसे और अपने gzip
आदेश को इसके बजाय उप- भाग में चला सकते हैं ।
यह आदेश gzip
सभी एस .css
और .html
किसी भी उसकी उप-की वर्तमान निर्देशिका में फ़ाइलों, के किसी भी उनके उपनिर्देशिका, आदि, मूल फ़ाइलें (रखते हुए -k
) और आप इसे (क्या कर रही है कह -v
):
(shopt -s globstar; gzip -vk **/*.{css,html})
यदि आप फ़ाइल नाम मामले-असंवेदनशील से मेल खाना चाहते हैं, तो कुछ या सभी अक्षरों के साथ उन एक्सटेंशन को शामिल किया गया है, तो आप nocaseglob
शेल विकल्प को भी सक्षम कर सकते हैं :
(shopt -s globstar nocaseglob; gzip -vk **/*.{css,html})
;
दो आदेशों को अलग करता है, और बाहरी (
)
कारण उन्हें एक उपधारा में चलाया जाता है। किसी सब-शेल में शेल विकल्प सेट करने से कॉलिंग शेल में सेट होने का कारण नहीं बनता है। यदि आप सक्षम करना चाहते हैं globstar
तो आप दौड़ सकते हैं shopt -s globstar
; तो आप बस कमांड चला सकते हैं:
gzip -vk **/*.{css,html}
आप के globstar
साथ अक्षम कर सकते हैं shopt -u globstar
। यदि आप वर्तमान में इसके साथ सक्षम हैं, तो आप देख सकते हैं shopt globstar
।
यह काम किस प्रकार करता है
यह gzip
कमांड कैसे काम करता है इसकी कुंजी यह है कि शेल इस पर विस्तार करता है कि डायरेक्टरी पदानुक्रम में प्रत्येक फाइल की एक सूची का मिलान नाम के साथ करने के लिए, फिर इनमें से प्रत्येक फाइलनाम को तर्क के रूप में पास करता है gzip
।
- ब्रेस विस्तार में बदल जाता
**/*.{css,html}
है **/*.css **/*.html
।
- फिर ग्लोबिंग उन दो पैटर्नों को मौजूदा डायरेक्टरी के तहत एक्सेस की जाने वाली फाइलों के नाम में विस्तारित करता है ( जिनकी
**
वजह से globstar
) जिनके फाइलनाम में कुछ भी शामिल है ( *
) निर्दिष्ट प्रत्यय के बाद ( .css
या .html
इस मामले में)।
यह उन फ़ाइलों से मेल नहीं खाता है जिनके नाम इस तरह से नामित निर्देशिकाओं के साथ शुरू होते.
हैं। आपके पास शायद ऐसी कोई HTML और CSS फाइलें नहीं हैं और यदि आप ऐसा करते हैं, तो आप शायद उन्हें शामिल नहीं करना चाहते हैं। लेकिन अगर आप उन्हें शामिल करना चाहते हैं, तो आप अपनी आवश्यकताओं के आधार पर उन्हें स्पष्ट रूप से मेल कर सकते हैं। उदाहरण के लिए, उन फ़ाइलों **/*.{css,html}
को **/{,.}*.{css,html}
शामिल करना , जो .
अभी भी फ़ोल्डरों में खोज नहीं कर रही हैं।
यदि आप चाहते हैं कि दोनों फाइलें जिनके नाम .
निर्देशिका में शुरू हों और फाइलें जिनका नाम .
शामिल होना शुरू हो, तो एक क्लीनर और सरल तरीका है: dotglob
शेल विकल्प को सक्षम करें ।
(shopt -s globstar dotglob; gzip -vk **/*.{css,html})
या यदि आप चाहते हैं कि केस-असंवेदनशील मेल और मेल -मिलाप के साथ शुरू होने वाले फ़ाइल नाम .
:
(shopt -s globstar nocaseglob dotglob; gzip -vk **/*.{css,html})
यह बहुत दुर्लभ है, हालांकि बहुत **
लंबे समय के लिए इसका विस्तार करना संभव है ।
यदि आपके पास इस तरह नामित फ़ाइलों की एक बड़ी संख्या है, तो यह यह बताते हुए एक त्रुटि संदेश के साथ विफल हो सकता है कि शेल कमांड लाइन का निर्माण नहीं कर सकता है क्योंकि यह बहुत लंबा होगा। (हजारों फाइलों के साथ भी, यह आमतौर पर कोई समस्या नहीं है।)
gzip
आपको बिल्कुल भी नहीं बुलाया जाएगा, इसलिए आपको आधा काम नहीं मिलेगा।
यदि यह त्रुटि होती है, या यदि आप इसके बारे में चिंतित हैं, तो आप इसके find
साथ उपयोग कर सकते हैं -exec
, जैसा कि स्टीलड्राइवर वर्णन करता है (साथ {} \;
) या जैसा कि मैं नीचे (साथ {} +
) का वर्णन करता हूं ।
आप कार्रवाई के find
साथ -exec
और +
दक्षता के लिए उपयोग कर सकते हैं ।
gzip
आदेश का समर्थन करता है दिया जा रहा से अधिक फ़ाइलों के नाम संकुचित करने की। लेकिन यह find
कमांड, हालांकि यह अच्छी तरह से काम करता है और तब तक धीमा नहीं होगा जब तक कि आपके पास कई फाइलें न हों, प्रत्येक फाइल के gzip
लिए एक बार कमांड चलाता है :
find . \( -name \*.css -o -name \*.html \) -exec gzip -vk {} \;
यह काम करता है, और आप निश्चित रूप से इसका उपयोग कर सकते हैं। ( .
वर्तमान निर्देशिका से खोज। इसके अलावा, यह वास्तव में स्टीलड्राइवर के बहुत अच्छे उत्तर में कमांड लिखने का एक अलग तरीका है ; आप जो भी पसंद करते हैं, उसका उपयोग कर सकते हैं।)
तुम भी find
कई फाइलनामों को पास कर सकते हैं gzip
और इसे केवल आवश्यकतानुसार कई बार चला सकते हैं - जो लगभग हमेशा सिर्फ एक बार होता है। ऐसा करने के लिए, के बजाय का उपयोग करें+
\;
। +
तर्क के तुरंत बाद ही आना चाहिए {}
। अतिरिक्त फ़ाइल नाम के साथ find
प्रतिस्थापित करता है +
, यदि कोई हो।
find . \( -name \*.css -o -name \*.html \) -exec gzip -vk {} +
+
यहां तक कि अगर कुछ ही मिलान वाली फाइलें हैं, तो भी इसका उपयोग करना ठीक है , और जब उनमें से कई हैं, तो यह gzip
प्रत्येक फ़ाइल के लिए एक अलग आह्वान होने की तुलना में अधिक तेज़ हो सकता है ।
जैसा कि स्टीलड्राइवर का उल्लेख है , आप मैच फाइलों के -iname
बजाय उपयोग कर सकते हैं, -name
जिनका नाम पसंद है .css
या .html
अलग-अलग पूंजीकरण के साथ। सक्षम करने के लिए इस मेल खाती nocaseglob
में globstar
आधारित विधि ऊपर वर्णित है।
अंत में, आपके पास संभवत: कोई मेल खाने वाली फ़ाइल या निर्देशिका नहीं है जो इसके साथ शुरू होती है .
। लेकिन अगर आप करते हैं, तो find
स्वचालित रूप से उन्हें शामिल करता है। यदि आप उन्हें बाहर करना चाहते हैं (जैसा कि बंद globstar
होने पर ऊपर बताई गई विधि के साथ होता dotglob
है), आप कर सकते हैं :
find . -not -path '*/.*' \( -name \*.css -o -name \*.html \) -exec gzip -vk {} +
globstar
आधारित तरीका ऊपर वर्णित लिखने के लिए आसान है, खासकर यदि आप को छोड़कर निर्देशिका और फ़ाइलों के साथ शुरू कर रहे हैं .
, के बाद से है कि डिफ़ॉल्ट है।
क्या नहीं करना है ...
रास्ते के विभाजक /
और अशक्त चरित्र को छोड़कर किसी भी वर्ण में फिल्नाम शामिल हो सकते हैं । कई तकनीकें जो अजीब फ़ाइलनामों पर टूटती हैं, मौजूद हैं, और वे आमतौर पर उन तकनीकों की तुलना में अधिक जटिल हैं जो हमेशा काम करती हैं। इसलिए मैं सुझाव देता हूं कि जब आप जानते हैं (या आपको लगता है कि आप जानते हैं) तब भी उनसे बचने की सलाह देते हैं। और निश्चित रूप से आपको उनका उपयोग नहीं करना चाहिए यदि आपके पास वर्णों के साथ फ़ाइलनाम हो सकते हैं जो विशेष रूप से रिक्त स्थान सहित इलाज किया जा सकता है।
find
किसी अन्य कमांड के आउटपुट को सुरक्षित रूप से पाइप करना संभव है जो इसे प्रोसेस करता है यदि आप इसका उपयोग करते हैं -print0
या इसी तरह की कार्रवाई के कारण इसे एक न्यूलाइन के बजाय रास्तों के बीच एक अशक्त चरित्र डालते हैं , और अन्यथा नहीं। फ़ाइल नाम में नई सीमाएँ हो सकती हैं (हालांकि मैं आपको जानबूझकर उनके साथ नामकरण करने से हतोत्साहित करता हूँ)। कार्रवाई के find
साथ एक कमांड -print
- जिसमें बिना किसी स्पष्ट कार्रवाई के कमांड शामिल हैं, तब -print
से डिफ़ॉल्ट है - आउटपुट का उत्पादन नहीं करता है जिसे सुरक्षित रूप से पाइप किया जा सकता है या अन्यथा किसी अन्य कमांड को प्रदान किया जा सकता है जो फ़ाइलों पर कार्रवाई करता है।
कार्रवाई के find
साथ उत्पादन का उत्पादन -print0
सुरक्षित रूप से किया जा सकता है xargs -0
( -0
झंडा xargs
अशक्त इनपुट की अपेक्षा करता है)।
-r
डिजाइन के अनुसार काम करता है। से आदमी gzip : सफर निर्देशिका संरचना रिकर्सिवली। यदि कमांड लाइन पर निर्दिष्ट फ़ाइल नामों में से कोई भी निर्देशिका है , तो gzip निर्देशिका में उतरेगा और वहां मिलने वाली सभी फ़ाइलों को संपीड़ित करेगा (या गनज़िप के मामले में उन्हें हटा देगा)। (जोर मेरा)