如何区分带后缀和不带后缀的文件名?

时间:2018-12-23 18:18:35

标签: linux sed filenames suffix

我正在编写一个bash shell脚本来输出文件名的后缀。

在这种情况下,我使用:

sed 's|.*\.||'

所以输出例如:

png
exe
c

但是,如果文件名没有后缀,因此也没有点怎么办?我的输出应为“无后缀”,但我不知道该如何使用sed。

编辑 我已经尝试过的:

目录:

abc.x
abc.y
abc

输入:

find . -type f | sed -E 's/^[^.]+$/no suffix/; s/.*\.//'

输出:

x
y
/abc

6 个答案:

答案 0 :(得分:2)

使用2个连续替换:

sed -E 's/^[^.]+$/no suffix/; s/.+\.//'

答案 1 :(得分:0)

awk中的一个。首先,一些未提供的测试材料:

$ cat foo
this.foo
that.bar
nothing

awk:

$ awk '{n=split($0,a,".");print (n>1?a[n]:"no suffix")}' foo
foo
bar
no suffix

答案 2 :(得分:0)

怎么样

sed '/.*\./s///;t;s/.*/no suffix/'

正则表达式用点将线匹配。在这些行上,我们执行替换。如果发生替换,我们就完成了。否则,执行其他替换。

在替换模式中使用空正则表达式将使用以前的模式。如果发生替换,t命令分支;没有参数,我们跳转到脚本的末尾。 (否则,您可以使用:label设置标签,然后使用tlabel转到该标签。)

答案 3 :(得分:0)

$ cat file
abc.x
abc.y
abc

$ awk -F'.' '{print (NF>1 ? $NF : "no suffix")}' file
x
y
no suffix

答案 4 :(得分:0)

您可以使用POSIX shell 参数扩展来完成相同操作,而无需调用单独的实用程序。例如,要测试文件是否包含'.',您可以简单地使用test,例如:

[ "$i" = "${i%.*}" ]

请参见Posix Programmer's Manual - Shell Command Language - Parameter Expansion

如果测试为TRUE,则不存在扩展名,否则,您可以使用其他 parameter扩展来获取扩展名本身,例如

[ "$i" = "${i%.*}" ] && echo "$i - no suffix" || echo "$i - ${i##*.}"

注意:,您将需要进行其他测试以排除.foo(例如 dotfiles ),但这留给您)

将其循环包装并排除目录文件,您可以测试目录中的每个文件,也可以在循环中使用read并将名称列表通过管道传递给它。例如,循环遍历目录中的文件将导致:

...
ftlcdfil.c - c
geany-plugin_build_w_gtk+2.patch - patch
geany-plugins.spec - spec
geany.spec - spec
geany_build_w_gtk+2.patch - patch
getfl - no suffix
gtkw_save_test.txt - txt
gtkwrite-master.zip - zip
helloleap - no suffix
helloleap.c - c
jnl - no suffix
messages - no suffix
opensuse_15.0_1s_delay.svg - svg
...

答案 5 :(得分:0)

使用Perl

/tmp> ls ab*
abc  abc.x  abc.y
/tmp> perl -e ' print /\./? "$_\n" : "no suffix\n" for(glob("ab*")) '
no suffix
abc.x
abc.y
/tmp>