2013-08-16 43 views
14

我有一個shell腳本,我需要做一個命令,如果一個文件被壓縮(以.gz結尾),另一個如果不是。我真的不知道如何處理這個,這裏是什麼,我正在尋找一個輪廓:在bash中檢查文件擴展名的最簡單方法是什麼?

file=/path/name* 

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

'zip!= gzip',那應該是「這個fi le是(不)gzipped「 – jlliagre

+1

*正確*的方式是使用文件。 – devnull

回答

32

你可以用做簡單的regex,使用=~運營商[[...]]測試裏面:

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

這不會給你正確的答案,如果擴展名是.tgz,如果你在乎次在。但它很容易修復:

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

圍繞正則表達式引號的缺失是必要和重要的。你可以引用$file但沒有意義。

這可能會更好使用file實用程序:

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

喜歡的東西:

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

您應該使用'[['或引用'$ {file:-3}';否則如果'$ file'有一個空格作爲倒數第二個字符,或者(可能)在最後三個字符中包含一個glob元字符,它將會中斷。 – rici

+0

@rici: - 建議的謝謝。更新我的答案! :) –

+3

您也可以使用'$ {file ## *。} = gz',它可以在任何兼容POSIX的shell中運行。 – chepner

23

真的,在一個shell腳本符合這樣的模式最清晰,往往最簡單的方法是與case

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

是的你是對的。這是最乾淨的恕我直言。 – Nishant

相關問題