如何在bash中检索文件名或扩展名

时间:2013-10-01 14:40:27

标签: regex bash sed awk

我有一个脚本正在推出一些文件系统数据,以便上传到另一个系统。

如果我可以告诉自己每个文件实际上是什么样的文件,那将会非常方便,因为它将有助于稍后的查询。

所以,例如,假设我的脚本正在吐出以下内容:

/home/myuser/mydata/myfile/data.log
/home/myuser/mydata/myfile/myfile.gz
/home/myuser/mydata/myfile/mod.conf
/home/myuser/mydata/myfile/security
/home/myuser/mydata/myfile/last

最后,我想看看:

/home/myuser/mydata/myfile/data.log log
/home/myuser/mydata/myfile/myfile.gz gz
/home/myuser/mydata/myfile/mod.conf conf
/home/myuser/mydata/myfile/security security
/home/myuser/mydata/myfile/last last

有一种方法可以用正则表达式和sed来做到这一点,但我无法弄明白。

有什么建议吗?

修改

我需要通过命令行获取此信息。到目前为止看到答案,我显然没有说清楚。因此,对于我提供的示例数据,假设数据全部通过greps和seds(数据已经消毒)。我需要能够将示例数据传递给sed / grep / awk /,以便产生所需的结果。

5 个答案:

答案 0 :(得分:2)

这应该适合你:

x='/home/myuser/mydata/myfile/security'
( IFS=[/.] && arr=( $x ) && echo ${arr[@]:(-1):1} )
security

x='/home/myuser/mydata/myfile/data.log'
( IFS=[/.] && arr=( $x ) && echo ${arr[@]:(-1):1} )
log

答案 1 :(得分:2)

打印由非字母字符分隔的最后一个字段。

awk -F '[^[:alpha:]]' '{ print $0,$NF }'
/home/myuser/mydata/myfile/data.log log
/home/myuser/mydata/myfile/myfile.gz gz
/home/myuser/mydata/myfile/mod.conf conf
/home/myuser/mydata/myfile/security security
/home/myuser/mydata/myfile/last last

答案 2 :(得分:1)

提取文件名路径中的最后一个元素:

filename=$(path##*/}

在文件名中的点后面提取字符:

extension=${filename##*.}

但是(我的评论)而不是查看扩展名,使用file可能更好。请参阅man file

答案 3 :(得分:1)

正如其他人已经回答的那样,解析文件名:

extension="${full_file_name##*.}"   # BASH and Kornshell/POSIX only
filename=$(basename "$full_file_name")
dirname=$(dirname "$full_file_name")

如果文件名中可能包含空格,制表符或其他奇怪的字符,则需要引号。

您还可以使用test命令(已链接[来测试文件是目录,文件还是链接,以便test -f foo为与[ -f foo ]相同。

然而,你说:“如果我能告诉自己每个文件实际上是文件那将会非常方便。

在这种情况下,您可能需要调查file命令。此命令将返回由某种魔术文件(传统上在/etc/magic中)确定的文件类型,但较新的实现可以使用用户自己的方案。这可以通过扩展名和文件标题中的幻数或通过查看文件中的前几行(在第一行中查找正则表达式^#! .*/bash$来说明文件类型

答案 4 :(得分:1)

这会在斜杠或点后提取最后一个组件。

awk -F '[/.]' '{ print $NF }'