如何在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