【问题标题】:How to print only the filename part of files that contain a certain string?如何仅打印包含特定字符串的文件的文件名部分?
【发布时间】:2017-09-24 09:42:26
【问题描述】:

我需要打印出包含字符串“XYZ”的文件名(例如A001.txt)。 我试过这个:
grep -H -R "XYZ" ~/directory/*.txt | cut -d':' -f1

它将输出整个路径(例如~/directory/A001.txt)。我怎样才能让它只输出文件名(例如A001.txt)?

【问题讨论】:

    标签: linux awk grep find


    【解决方案1】:

    为什么,当有一个为这项工作设计的非常好的工具并且名称非常明显时,为什么 GNU 家伙会给 grep 一个递归查找文件的选项。叹息……

    find . -type f -exec awk '/XYZ/{print gensub(/.*\//,"",1,FILENAME); nextfile}' {} +
    

    上面使用了 GNU awk,我假设你已经打算使用 GNU grep。

    【讨论】:

      【解决方案2】:

      grep -lr term dir/to/search/ | awk -F'/' '{print $NF}' 应该可以解决问题。

      -l 只列出文件名,包括它们的目录。

      -r 递归遍历目录树和指定目录中的所有文件。

      这一切都被传送到awk,它被告知使用/作为分隔符(不允许在文件名中,所以不要尽可能脆弱)并打印最后一个字段(NF是字段计数,所以$NF 是最后一个字段)

      【讨论】:

        【解决方案3】:
        grep -Rl "content" | xargs -d '\n' basename -a
        

        这应该可以解决问题,只打印不带路径的文件名。

        basename 打印带有任何前导目录组件的文件名 NAME 删除。

        参考:https://linux.die.net/man/1/basename

        【讨论】:

        • 如果你有 -d '\n' 的 GNU 工具,那么你应该一直使用 grep -Z 和 xargs -0。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-03
        • 2023-03-20
        • 2021-04-28
        • 1970-01-01
        • 2013-03-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多