0

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

如果我能告诉自己每个文件实际上是什么“类型”文件,那将非常方便,因为它将有助于以后进行一些查询。

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

/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/whatever 以产生所需的结果。

4

5 回答 5

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
于 2013-10-01T14:49:04.700 回答
2

Print last filed that are separated by a none alpha character.

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
于 2013-10-01T15:55:50.410 回答
1

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

filename=$(path##*/}

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

extension=${filename##*.}

但是(我的评论)与其查看扩展名,不如使用file. 见man file

于 2013-10-01T15:00:46.623 回答
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命令。此命令将返回由某种魔法文件(传统上为 in /etc/magic)确定的文件类型,但较新的实现可以使用用户自己的方案。这可以通过扩展名和文件头中的幻数来判断文件类型,或者通过查看文件的前几行(在第一行中查找正则表达式^#! .*/bash$

于 2013-10-01T15:39:32.153 回答
1

这将提取斜线或点之后的最后一个组件。

awk -F '[/.]' '{ print $NF }'
于 2013-10-01T15:42:04.180 回答