我有一个脚本正在推出一些文件系统数据,以便上传到另一个系统。
如果我可以告诉自己每个文件实际上是什么样的文件,那将会非常方便,因为它将有助于稍后的查询。所以,例如,假设我的脚本正在吐出以下内容:
/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 /,以便产生所需的结果。
答案 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 }'