2013-08-16 20 views
14

Mam skrypt powłoki, w którym muszę wykonać jedno polecenie, jeśli plik jest spakowany (kończy się na .gz), a drugi, jeśli nie jest. Nie jestem pewien, w jaki sposób podejść do tego, oto zarys tego, co szukam:Najprostszym sposobem sprawdzenia rozszerzenia pliku w bashu?

file=/path/name* 

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

'zip! = gzip', to powinno być" to fi le is (not) gzipped " – jlliagre

+1

* Właściwym * sposobem byłoby użycie pliku. – devnull

Odpowiedz

32

Można to zrobić z proste regex, używając operatora =~ wewnątrz [[...]] testu:

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

nie daje właściwą odpowiedź, czy rozszerzenie jest .tgz, jeśli dbasz o TH w. Ale to jest łatwe do naprawienia:

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

Brak notowań wokół regex jest niezbędny i ważny. Możesz zacytować $file, ale nie ma sensu.

Byłoby zapewne lepiej byłoby użyć narzędzia file:

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

coś takiego:

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

W 'bash' możesz także użyć' if [[$ file = * .gz]] 'zamiast dopasowywania wyrażenia regularnego. – chepner

+0

@chepner, to prawda, ale chciałem podać wzór, który pasuje do '.gz' lub' .tgz'. Trzeba przyznać, że twój jest nieco krótszy. Myślę, że rozwiązanie 'file' jest lepszym wyborem. – rici

9

Można spróbować czegoś takiego: -

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

Powinieneś użyć '[[lub' quote '$ {plik: -3}'; w przeciwnym razie przerwie się, jeśli '$ plik' ma spację jako jego drugi znak lub (prawdopodobnie) zawiera globus metaznakowy w trzech ostatnich znakach. – rici

+0

@rici: -Thanx za sugestię. Zaktualizowano również moją odpowiedź! :) –

+3

Można również użyć '$ {plik ## *.} = Gz', który będzie działać w dowolnej powłoce zgodnej z POSIX. – chepner

23

Naprawdę, najwyraźniejszy i często najprostszy sposób, aby dopasować wzory jak to w skrypcie powłoki jest z case

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

Tak, masz rację. To jest najczystsze IMHO. – Nishant

Powiązane problemy