String 在Bash中获取文件的扩展名

String 在Bash中获取文件的扩展名,string,bash,filenames,String,Bash,Filenames,我正在写一个脚本,它将按扩展名对文件进行排序。我知道一种通过文件名来实现的方法。问题是,相同的文件名称中没有扩展名。例如,如果我有文件:file.txt那么通过简单的extension=“${filename##*.}”获取扩展名是没有问题的。但如果文件名只是filename,则此方法不起作用。在Bash脚本中,是否有其他选项可以获取文件扩展名并将其放入变量 filename="file.txt" ext="${filename##*.}" if [[ "$ext" != "$filename"

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

filename="file.txt"
ext="${filename##*.}"
if [[ "$ext" != "$filename" ]]; then echo "$ext"; else echo "no extension"; fi
输出:

txt no extension 输出:

txt no extension 没有分机
没有像
[[
这样的巴西主义:

中的case$filename
(*.*)扩展名=${filename##*.};;
(*)扩展名=”;;
以撒

可以在任何Bourne heritage shell中使用。

您可以通过删除扩展名来获取文件的基本名称,即从原始文件中删除扩展名

base=${filename%.*}
ext=${filename#$base.}
不过,我更喜欢
案例
陈述;意图更明确。

适用于以下情况:

$ ls file*
file1  file1.txt  file2  
您可以执行以下操作:

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

似乎您只是询问如何将文件名的文件扩展名放入bash中的变量中,而不是询问排序部分。 为此,以下简短脚本可以打印文件列表中每个文件的扩展名

#!/bin/sh
filesInCurrentDir=`ls`
for file in $filesInCurrentDir; do
    extention=`sed 's/^\w\+.//' <<< "$file"`
    echo "the extention for $file is: "$extention #for debugging
done
上述脚本的结果:

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

这样,没有扩展名的文件将导致扩展名变量为空。

但问题是,这些名称中没有扩展名的文件是例如txt或jpg文件,我应该将它们放在适当的文件夹中。反对者:如果你能解释我的错在哪里,我可以查看我的答案。虽然我没有投你反对票,但我没有ed告诉您,您的解决方案很容易出错。只需运行
触摸“file spaced.txt”
并测试您的代码。此外,谷歌搜索为什么不应该解析
ls
的输出,以及如何使用for和globing循环文件(即
for file in*
)-另一个灰色点是在bash配备参数扩展时使用sed,可以为您带来所需的结果。就像在luna park使用机关枪赢得泰迪熊一样。而且并非所有的
sed
版本都工作相同。如果没有扩展名,此代码的可能副本实际上会返回$filename。通过添加第二步,如果没有扩展名,可以使其返回“”。
extension\u echo(){file=$1;base=${file%.*};ext=${file}$base};ext=${ext};echo“$ext”}