我正在bash中编写夜间构建脚本。 一切都很好,除了一个小障碍:

#!/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语句中,测试txt文件。

如何确定文件后缀为。txt ?


当前回答

另一个重要的细节是,你不能在内部使用else和另一个if:

else
    if [ "$file" == "*.txt" ]       
    #  this is the snag
    then
    # do something txt-ish
fi

而不是:

elif [ "$file" == "*.txt" ]       
    #  this is the snag
then
    # do something txt-ish
fi

Else在没有其他命令时使用

仅仅因为你能做某件事,并不意味着你应该一直做下去

其他回答

我写了一个bash脚本,它可以查看文件的类型,然后将其复制到一个位置,我用它来查看我从firefox缓存中在线观看的视频:

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

它使用了类似的想法,在这里提出,希望这是有用的人。

在Unix系统中,您无法确定.txt文件是否真的是文本文件。你最好使用“file”。也许可以试试:

file -ib "$file"

然后,您可以使用MIME类型列表来匹配或解析MIME的第一部分,在那里您可以获得诸如“文本”,“应用程序”等内容。

如何在linux中获取可用的扩展名的正确答案是:

${filename##*\.} 

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

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

另一个重要的细节是,你不能在内部使用else和另一个if:

else
    if [ "$file" == "*.txt" ]       
    #  this is the snag
    then
    # do something txt-ish
fi

而不是:

elif [ "$file" == "*.txt" ]       
    #  this is the snag
then
    # do something txt-ish
fi

Else在没有其他命令时使用

仅仅因为你能做某件事,并不意味着你应该一直做下去

使

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

是这样的:

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

也就是说,只有双括号,没有引号。

==的右侧是一个外壳模式。 如果需要正则表达式,则使用=~ then。