【问题标题】:how to retrieve filename or extension within bash [duplicate]如何在bash中检索文件名或扩展名[重复]
【发布时间】: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。注意他有时需要扩展名,有时需要文件名。

标签: regex bash sed awk


【解决方案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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-29
        • 2017-10-28
        • 2014-12-10
        • 2011-11-25
        • 2016-07-20
        • 2016-09-02
        • 2023-04-07
        相关资源
        最近更新 更多