我想编写一个脚本来仅返回输入文件名的扩展名。例如,textfile.txt
应该返回txt
.
我是 Linux 和 bash 的新手,我正在尝试学习如何编写基本脚本。谢谢!
ter*_*don 34
外壳程序,例如 bash,具有许多字符串操作功能。其中之一可让您删除指定模式的所有内容:
${VAR##GLOB}
Run Code Online (Sandbox Code Playgroud)
上面的语法从变量中删除所有内容,$VAR
直到 glob 的第一个匹配项GLOB
。因此,要打印没有名称的文件扩展名,您可以执行以下操作:
$ file="file.txt"
$ echo ${file##*.}
txt
Run Code Online (Sandbox Code Playgroud)
请注意,这也可以处理多个“扩展”:
$ file="file.new.txt"
$ echo ${file##*.}
txt
Run Code Online (Sandbox Code Playgroud)
如果您不希望那样,请改用一个#
,这将删除最短的匹配项而不是最长的匹配项:
$ echo ${file#*.}
new.txt
Run Code Online (Sandbox Code Playgroud)
现在,要在目录中的所有文件上运行它,您可以执行以下操作:
$ ls
file.avi file.pdf file.png file.txt
$ for file in *; do echo "$file : ${file##*.}"; done
file.avi : avi
file.pdf : pdf
file.png : png
file.txt : txt
Run Code Online (Sandbox Code Playgroud)
而且,为了完整起见,您还可以使用以下命令获取不带扩展名的文件名${file%.*}
:
$ for file in *; do echo "$file : ${file##*.} : ${file%.*}"; done
file.avi : avi : file
file.pdf : pdf : file
file.png : png : file
file.txt : txt : file
Run Code Online (Sandbox Code Playgroud)
通过参数扩展:
$ x="textfile.txt"
$ echo ${x##*.}
txt
Run Code Online (Sandbox Code Playgroud)
该${parameter##word}
模式删除匹配的最大前缀word
(除了文件结尾之外的所有前缀)。