I have a shell script where I need to do one command if a file is zipped (ends in .gz) and another if it is not. I'm not really sure how to approach this, here's an outline of what I'm looking for:
file=/path/name* if [ CHECK FOR .gz ] then echo "this file is zipped" else echo "this file is not zipped" fi
Using Bash, there's also ${file%. *} to get the filename without the extension and ${file##*.} to get the extension alone. That is, file="thisfile.
To find out file types we can use the file command. Using the -s option we can read the block or character special file. Using -F option will use string as separator instead of “:”. We can use the –extension option to print a slash-separated list of valid extensions for the file type found.
Remove File Extension Using the basename Command in Bash If you know the name of the extension, then you can use the basename command to remove the extension from the filename. The first command-Line argument of the basename command is the variable's name, and the extension name is the second argument.
You can do this with a simple regex, using the =~
operator inside a [[...]]
test:
if [[ $file =~ \.gz$ ]];
This won't give you the right answer if the extension is .tgz
, if you care about that. But it's easy to fix:
if [[ $file =~ \.t?gz$ ]];
The absence of quotes around the regex is necessary and important. You could quote $file
but there is no point.
It would probably be better to use the file
utility:
$ file --mime-type something.gz something.gz: application/x-gzip
Something like:
if file --mime-type "$file" | grep -q gzip$; then echo "$file is gzipped" else echo "$file is not gzipped" fi
Really, the clearest and often easiest way to match patterns like this in a shell script is with case
case "$f" in *.gz | *.tgz ) # it's gzipped ;; *) # it's not ;; esac
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With