如何在bash脚本中检查文件名的扩展名?

我正在编写一个每晚构build脚本。
除了一个小小的障碍之外,一切都很好,

#!/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; 

我的问题是确定文件扩展名,然后相应的行事。 我知道这个问题是在if语句中,testing一个txt文件。

如何确定文件是否有.txt后缀?

我想你想说“$文件的最后四个字符是否等于.txt ?” 如果是这样,您可以使用以下内容:

 if [ ${file: -4} == ".txt" ] 

请注意, file:-4之间的空格是必需的,因为“: – ”修饰符意味着不同的东西。

使

 if [ "$file" == "*.txt" ] 

喜欢这个:

 if [[ $file == *.txt ]] 

那就是双括号,没有引号。

==的右侧是一个shell模式。 如果你需要一个正则expression式,使用=~那么。

你可以使用“文件”命令,如果你真的想找出有关文件的信息,而不是依赖于扩展。

如果您对使用扩展名感到满意,可以使用grep来查看它是否匹配。

你不能确定在Unix系统上,一个.txt文件确实是一个文本文件。 你最好的select是使用“文件”。 也许尝试使用:

 file -ib "$file" 

然后,您可以使用MIMEtypes列表来匹配或parsingMIME的第一部分,您可以在其中获得“文本”,“应用程序”等内容

你也可以这样做:

  if [ "${FILE##*.}" = "txt" ]; then # operation for txt files here fi 

与'file'类似,使用稍微简单的'mimetype -b',无论文件扩展名如何,它都可以工作。

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

编辑:如果mimetype不可用,则可能需要在系统上安装libfile-mimeinfo-perl

我写了一个bash脚本,查看文件的types,然后将其复制到一个位置,我使用它来查看我从firefoxcaching在线观看的video:

 #!/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"& 

它使用与这里提出的类似的想法,希望这对某人有帮助。

我想'$PATH_TO_SOMEWHERE'就像'<directory>/*'

在这种情况下,我会将代码更改为:

 find <directory> -maxdepth 1 -type d -exec ... \; find <directory> -maxdepth 1 -type f -name "*.txt" -exec ... \; 

如果您想对目录和文本文件名进行更复杂的操作,您可以:

 find <directory> -maxdepth 1 -type d | while read dir; do echo $dir; ...; done find <directory> -maxdepth 1 -type f -name "*.txt" | while read txtfile; do echo $txtfile; ...; done 

如果您的文件名中有空格,您可以:

 find <directory> -maxdepth 1 -type d | xargs ... find <directory> -maxdepth 1 -type f -name "*.txt" | xargs ... 

关于如何在Linux中使用扩展名的正确答案是:

 ${strFileName##*\\.} 

在目录中打印所有文件扩展名的示例

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

我把它砍了

 >cut -d'.' -f2<<<"hi_mom.txt" txt 

我用awk来做这件事就像下面这样。

 >MY_DATA_FILE="my_file.sql" >FILE_EXT=$(awk -F'.' '{print $NF}' <<< $MY_DATA_FILE) >if [ "sql" = "$FILE_EXT" ] >then > echo "file is sql" >fi >awk -F'.' '{print $NF}' <<eof >hi_mom.txt >my_file.jpg >eof