关于字符串:获取bash中文件的扩展名

Get extension of files in Bash

本问题已经有最佳答案,请猛点这里访问。

我正在编写一个脚本,它将按扩展名对文件进行排序。我知道用文件名来实现这一点的方法。问题是,同一个文件的名称中没有扩展名。例如,如果我有文件:file.txt,那么通过简单的extension="${filename##*.}"获得扩展就没有问题。但是如果文件名只是filename这个方法不起作用。是否还有其他选项来获取文件扩展名并将其放入bash脚本中的变量中?


没有bashisms [[类:

1
2
3
4
case $filename in
  (*.*) extension=${filename##*.};;
  (*)   extension="";;
esac

公司在任何伯恩的遗产的外壳。


你可以把文件的基名称的城市扩展的解,解,从原始的。

1
2
base=${filename%.*}
ext=${filename#$base.}

case娱乐类的声明,虽然冰;意向明确。


1
2
3
filename="file.txt"
ext="${filename##*.}"
if [["$ext" !="$filename" ]]; then echo"$ext"; else echo"no extension"; fi

输出:

1
txt
1
2
3
filename="file"
ext="${filename##*.}"
if [["$ext" !="$filename" ]]; then echo"$ext"; else echo"no extension"; fi

输出:

1
no extension


一类情况:

1
2
$ ls file*
file1  file1.txt  file2

之类的东西,你可以做的:

1
2
3
4
$ ls file* |awk -F. '{print (NF>1?$NF:"no extension")}'
no extension
txt
no extension

它只表明你是问如何把这两个文件的文件名扩展到一个变量在bash,-你是不是要求(3方。 这样做,下面的简短的脚本可以打印的扩展(每个文件从一个文件列表。

1
2
3
4
5
6
#!/bin/sh
filesInCurrentDir=`ls`
for file in $filesInCurrentDir; do
    extention=`sed 's/^\w\+.//' <<<"$file"`
    echo"the extention for $file is:"$extention #for debugging
done

"这是《extention包含变量的流文件analysed extention称为冰。《命令与sed 's/^\w\+.//任何length of人物直到第一点发现的文件名,然后removes信息。因此,如果有多个文件extentions将是全列(如file.txt> get extention txtfile.odt.pdf> get extention odt.pdf)。

实例

当前文件夹的内容(这可能是任何空间分隔的列表文件,你的反馈回路)

1
2
3
4
5
6
7
8
9
10
11
aaab.png
abra
anme2.jpg
cadabra
file
file.png
file.txt
loacker.png
myText
name.pdf
rusty.jgp

结果:以上脚本

1
2
3
4
5
6
7
8
9
10
11
the extention of aaab.png is: png
the extention of abra is:
the extention of anme2.jpg is: jpg
the extention of cadabra is:
the extention of file is:
the extention of file.png is: png
the extention of file.txt is: txt
the extention of loacker.png is: png
the extention of myText is:
the extention of name.pdf is: pdf
the extention of rusty.jgp is: jgp

在这种方式中,没有将文件与推广的结果变量的扩展有空。