我想编写一个脚本来仅返回输入文件名的扩展名。例如,textfile.txt
应该返回txt
.
我是 Linux 和 bash 的新手,我正在尝试学习如何编写基本脚本。谢谢!
答案1
shell,例如 bash,有很多字符串操作特征。其中之一可以让您删除给定模式之前的所有内容:
${VAR##GLOB}
上面的语法从变量中删除所有内容,$VAR
直到第一次匹配 glob 为止GLOB
。因此,要打印文件的扩展名而不显示文件名,您可以这样做:
$ file="file.txt"
$ echo ${file##*.}
txt
请注意,这也可以处理多个“扩展”:
$ file="file.new.txt"
$ echo ${file##*.}
txt
如果您不想这样做,请改用一个#
,这将删除最短的匹配项而不是最长的匹配项:
$ echo ${file#*.}
new.txt
现在,要对目录中的所有文件运行此命令,您可以执行以下操作:
$ 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
而且,为了完整起见,您还可以使用以下命令获取不带扩展名的文件名${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
答案2
答案3
一个非常简单的 bash 脚本可以完成您想要的操作,如下所示:
#!/usr/bin/env bash
echo "$1" | awk -F '.' '{print $NF}'
该脚本被调用为script.sh test.txt
,它的作用是
它打印
$1
到标准输出。$1
是赋予脚本的第一个参数,在本例中为test.txt
。的 stdout 输出
echo
通过管道传输到 stdin,awk
其中分割字符串 (test.txt
).
,然后打印分割的最后一个元素(txt
在本例中)。
只是一个小评论,这可以用一句话来完成,因为这是一项非常简单的任务:
echo test.txt | awk -F '.' '{print $NF}'
答案4
为此,需要考虑几个注意事项:
- 该
foo.d/bar
文件没有扩展名,它不是foo
带.d/bar
扩展名的文件。 - 您可能还需要考虑
.bashrc
没有扩展名 .
和特殊目录文件..
可能应该被特殊对待并被认为没有任何扩展名。- 扩展名是做什么用的
file.tar.gz
?gz
或者tar.gz
?holiday.picture.jpg
或呢bash-4.4
? - 你应该返回什么
foo.d/
?空还是d
?
在这里,我会这样做:
#! /bin/sh -
for file do
case ${file##*/} in
(?*.*) ext=${file##*.};;
(*) ext=;;
esac
printf '%s\n' "$ext"
done