Linux получить расширение файла

How to check the extension of a filename in a bash script?

I am writing a nightly build script in bash.
Everything is fine and dandy except for one little snag:

#!/bin/bash for file in "$PATH_TO_SOMEWHERE"; do if [ -d $file ] then # do something directory-ish else if [ "$file" == "*.txt" ] # this is the snag then # do something txt-ish fi fi done; 

My problem is determining the file extension and then acting accordingly. I know the issue is in the if-statement, testing for a txt file. How can I determine if a file has a .txt suffix?

In addition to the answer of Paul, you can use $(dirname $PATH_TO_SOMEWHERE) and $(basename $PATH_TO_SOMEWHERE) to split into folder and directory and do something directory-ish and file-ish

11 Answers 11

That is, double brackets and no quotes.

The right side of == is a shell pattern. If you need a regular expression, use =~ then.

I didn’t know about this. It seems to be a special case that the right-hand side of == or != is expanded as a shell pattern. Personally I think this is clearer than my answer.

I am new to bash and it took me a little while to figure out how to use this in a multi conditional if statement. I am sharing it here in case it helps someone. if [[ ( $file == *.csv ) || ( $file == *.png ) ]]

@cheflo that’s good for multiple conditions in general. In this specific case, you could also use if [[ $file =~ .*\.(csv|png) ]] . It’s shorter, clearer, easier to add additional extensions and could be easily made configurable (by putting «csv|png» in a variable).

Читайте также:  Make prepare linux kernel

You can put double quotes around the file. if [[ «$file» == *.txt ]] If the file has spaces in its name, double-quoting is required.

@shawnhcorey There is no need for quoting $file, even if it contains a space. The [[ command does not do word splitting (nor pathname expansion). That is one of the main differences between [[ and [, and one of the main reasons to use [[.

I think you want to say «Are the last four characters of $file equal to .txt ?» If so, you can use the following:

Note that the space between file: and -4 is required, as the ‘:-‘ modifier means something different.

In bash, this will produce a «[: ==: unary operator expected» error unless you put quotes around the first variable. So if [ «$» == «.txt» ] instead.

A note for those that may be new to the bash/shell syntax: the space before the -4 is significant. «$» == «.txt» (no space) will not work as expected.

 if [ "$" = "txt" ]; then # operation for txt files here fi 

You just can’t be sure on a Unix system, that a .txt file truly is a text file. Your best bet is to use «file». Maybe try using:

Then you can use a list of MIME types to match against or parse the first part of the MIME where you get stuff like «text», «application», etc.

You can use the «file» command if you actually want to find out information about the file rather than rely on the extensions.

Читайте также:  Linux все запущенные демоны

If you feel comfortable with using the extension you can use grep to see if it matches.

yes I am aware of the file command. I had actually tried matching based on the output of said command. but I fail horribly at these if-statements.

The correct answer on how to take the extension available in a filename in linux is:

Example of printing all file extensions in a directory

for fname in $(find . -maxdepth 1 -type f) # only regular file in the current dir do echo $ #print extensions done 

Your answer uses a double backslash, but your example only uses a single backslash. Your example is correct, your answer isn’t.

Can you please explain the answer a little bit or link a documentation? I need to understand what does $

Similar to ‘file’, use the slightly simpler ‘mimetype -b’ which will work no matter the file extension.

if [ $(mimetype -b "$MyFile") == "text/plain" ] then echo "this is a text file" fi 

Edit: you may need to install libfile-mimeinfo-perl on your system if mimetype is not available

I wrote a bash script that looks at the type of a file then copies it to a location, I use it to look through the videos I’ve watched online from my firefox cache:

#!/bin/bash # flvcache script CACHE=~/.mozilla/firefox/xxxxxxxx.default/Cache OUTPUTDIR=~/Videos/flvs MINFILESIZE=2M for f in `find $CACHE -size +$MINFILESIZE` do a=$(file $f | cut -f2 -d ' ') o=$(basename $f) if [ "$a" = "Macromedia" ] then cp "$f" "$OUTPUTDIR/$o" fi done nautilus "$OUTPUTDIR"& 

It uses similar ideas to those presented here, hope this is helpful to someone.

Источник

Оцените статью
Adblock
detector