如何在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中检索文件名或扩展名[重复]的主要内容,如果未能解决你的问题,请参考以下文章
使用 find [重复] 在 bash 中操作字符串(文件扩展名)