2013-08-16 9 views
14

मेरे पास एक शेल स्क्रिप्ट है जहां फ़ाइल को ज़िपित किया जाता है (.gz में समाप्त होता है) और यदि कोई नहीं है तो मुझे एक कमांड करने की आवश्यकता है। मैं वास्तव में यकीन है कि यह कैसे दृष्टिकोण नहीं कर रहा हूँ, यहाँ मैं के लिए क्या देख रहा हूँ की एक रूपरेखा है:बैश में फ़ाइल एक्सटेंशन की जांच करने का सबसे आसान तरीका?

file=/path/name* 

if [ CHECK FOR .gz ] 
then echo "this file is zipped" 
else echo "this file is not zipped" 
fi 
+1

'ज़िप! = gzip', यह" यह होना चाहिए " ले है (नहीं) gzipped " – jlliagre

+1

* उचित * तरीका फाइल का उपयोग करना होगा। – devnull

उत्तर

32

आप एक साथ कर सकते हैं सरल regex, एक [[...]] परीक्षण अंदर =~ ऑपरेटर का उपयोग:

if [[ $file =~ \.gz$ ]]; 

यह आपको सही जवाब है, तो विस्तार .tgz है, यदि आप वें के बारे में परवाह नहीं देंगे पर। लेकिन यह ठीक करना आसान है:

if [[ $file =~ \.t?gz$ ]]; 

रेगेक्स के आसपास उद्धरणों की अनुपस्थिति आवश्यक और महत्वपूर्ण है। आप $file उद्धृत कर सकते हैं लेकिन कोई बात नहीं है।

$ file --mime-type something.gz 
something.gz: application/x-gzip 

कुछ की तरह:

यह शायद file उपयोगिता का उपयोग करने के लिए बेहतर होगा

if file --mime-type "$file" | grep -q gzip$; then 
    echo "$file is gzipped" 
else 
    echo "$file is not gzipped" 
fi 
+4

'bash' में, आप नियमित अभिव्यक्ति मिलान के स्थान पर' if [[$ file = * .gz]] 'का भी उपयोग कर सकते हैं। – chepner

+0

@chepner, पर्याप्त सच है लेकिन मैं पैटर्न प्रदान करना चाहता था जो '.gz' या '.tgz' से मेल खाता हो। माना जाता है कि आपका थोड़ा छोटा है। मुझे लगता है कि 'फाइल' समाधान बेहतर विकल्प है, हालांकि। – rici

9

आप कुछ इस तरह की कोशिश कर सकते हैं: -

if [[ ${file: -3} == ".gz" ]] 
+0

आपको '[[' या उद्धरण '$ {फ़ाइल: -3}' का उपयोग करना चाहिए; अन्यथा यह तोड़ देगा यदि '$ file' में एक स्थान है क्योंकि यह दूसरा अंतिम चरित्र है, या (संभवतः) पिछले तीन वर्णों में एक ग्लोब मेटाएक्टेक्टर है। – rici

+0

@rici:-सुझाव के लिए थेंक्स। मेरा जवाब भी अपडेट किया !! :) –

+3

आप '$ {file ## *।} = Gz' का भी उपयोग कर सकते हैं, जो किसी भी POSIX-compliant shell में काम करेगा। – chepner

23

वास्तव में, स्पष्ट और अक्सर सबसे आसान तरीका है एक खोल स्क्रिप्ट में इस तरह प्रतिमानों से मिलान करने के लिए है case

case "$f" in 
*.gz | *.tgz) 
     # it's gzipped 
     ;; 
*) 
     # it's not 
     ;; 
esac 
+0

हाँ आप सही हैं। यह सबसे साफ IMHO है। – Nishant

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