【问题标题】:Finding file names without a specified character查找没有指定字符的文件名
【发布时间】:2023-03-20 09:10:01
【问题描述】:

有没有很好的regex 来查找所有包含某个字符的文件?我知道有很多可以找到包含匹配项的行,但我想要一些能够找到所有包含我的匹配项的文件。

【问题讨论】:

    标签: regex linux file unix sed


    【解决方案1】:

    对于 bash - 列出目录中的所有文件-:

    shopt -s extglob
    ls !(*.*)
    

    需要 extglob 设置才能启用!这否定了 ls.

    . 参数

    【讨论】:

    • 没有ls,创建一个数组:no_ext_files=(!(*.*)); num="${#no_ext_files[@]}"
    • @suspectus:如果目录有子目录,我认为您的解决方案(包括 ls)不起作用。
    【解决方案2】:

    使用lssed 将所有没有扩展名(即不包含.)的文件名替换为NoExtension

    ls | sed -e 's/^[^.]*$/NoExtension/g'
    

    用扩展名替换具有扩展名的文件名:

    ls | sed -e 's/^[^.]*$/NoExtension/g' -e 's/.*\.\(.*\)/\1/'
    

    【讨论】:

    • sort | uniq -c | sort -n 附加到最后一个命令以获得排序计数。更短的 sed 替代方案:/\./! s/$/.NoExtension/; s/.*\.//.
    【解决方案3】:

    还有一个 awk 解决方案,很好衡量。

    ls | awk '$0 !~ /\..+$/{a++}END{print a}'
    

    【讨论】:

    • 这会打印计数而不是文件名应该是 ls | awk '!/\..+$/' 但您不想完全解析 ls 的输出。
    • 我的 awk 脚本(计数)在编辑之前与他的简报(计数目录中没有扩展名的文件)匹配:计数文件。对于手头的任务 ls 是完全足够的,我不会解析文件名以外的任何内容。
    【解决方案4】:

    这可能对你有用(查找、GNU sed 和 wc):

    find . -type f | sed -rn '\|.*/\.?[^.]+$|w NoExtensions' && wc -l NoExtensions
    

    这会给你一个计数和一个列表。

    注意包含dot 没有扩展名的文件。

    【讨论】:

      【解决方案5】:

      您应该丢弃所有解析ls 输出的答案,阅读here 了解原因。工具find 非常适合。

      # Show files in cwd
      $ ls
      file  file.txt
      
      # Find the files with an extension 
      $ find -type f  -regex '.*/.*\..*$'
      ./file.txt
      
      # Invert the match using the -not option
      $ find -type f  -not -regex '.*/.*\..*$'
      ./file
      

      【讨论】:

        猜你喜欢
        • 2011-05-01
        • 1970-01-01
        • 2016-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-29
        相关资源
        最近更新 更多