如何在bash中检索文件名或扩展名[重复]

Posted

技术标签:

【中文标题】如何在bash中检索文件名或扩展名[重复]【英文标题】:how to retrieve filename or extension within bash [duplicate] 【发布时间】:2013-10-07 18:52:41 【问题描述】:

我有一个脚本将一些文件系统数据推送到另一个系统。

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

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

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

【问题讨论】:

我不能给你实际的解决方案,但是这样做的方法。您必须在最后找到的“。”处“拆分”。如果我们从 0 开始索引,则字符和第一个元素将是您的扩展名。如果没有“。”发现您的结果应该是最后一个“/”字符之后的字符串。此外,谷歌搜索“bash 获取文件扩展名”。祝你好运。 与其查看扩展名,不如使用file。见man file @fedorqui 我不觉得这是重复。我需要能够通过命令行工具获取此信息。也许我没有说清楚。原始数据通过 grep 和 sed 提供。我需要能够通过管道获取结果。另外,在您立即否决我的问题之前,请先询问我的澄清。如果我发现我的问题是重复的,我完全有能力将其标记为重复。 @jasonmclose 这不是重复,但您可以从中获得主要思想:获取扩展名和名称。剩下的就是遍历你收到的输出了。 这不是重复因为这些例子:/mod.conf conf /security security。注意他有时需要扩展名,有时需要文件名。 【参考方案1】:

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

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】:

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

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

【讨论】:

【参考方案3】:

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

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】:

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

filename=$(path##*/

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

extension=$filename##*.

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

【讨论】:

对不起。我不清楚我的问题。我需要大量获取这些数据,这意味着来自 bash 中的命令行,而不是来自 bash 脚本。因此,如果我提供的示例数据是 grep'ing 和 pipe'ing 和 sed'ing 的结果,我需要能够再添加一个 sed/awk/whatever 以达到我想要的结果。 @jasonmclose 为什么不使用read 管道进入bash 脚本?【参考方案5】:

这应该适合你:

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

【讨论】:

以上是关于如何在bash中检索文件名或扩展名[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 Bash 中获取文件的扩展名 [重复]

删除文本文件bash中的文件扩展名[重复]

使用 find [重复] 在 bash 中操作字符串(文件扩展名)

仅从 Bash 脚本中的路径获取文件名 [重复]

如何查找多个文件、检查重复文件并用 bash、sed 脚本替换

在 Bash 中递归更改文件扩展名