【问题标题】:bash list files of a particular naming conventionbash 列出特定命名约定的文件
【发布时间】:2021-08-24 05:02:19
【问题描述】:

操作系统 - Linux (Ubuntu 20.04)

我有一个包含数千个文件的目录。文件名范围从 a.daily.csv 到 a.b.daily.csv 到 a.b.c.daily.csv 到 a.b.c.d.daily.csv 到 a.b.c.d.e.daily.csv

我面临的挑战是仅列出 a.daily.csv 或 a.b.daily.csv 等。也就是说,以“daily.csv”作为固定部分,我希望能够将其前面的内容用“.”进行通配符。作为字段之间的分隔符

我尝试了一些通配符,例如 ? [a-zA-Z0-9] 等但无法实现这一点。请给我一些指导

请注意 a、b、c 等是我用来发布问题的占位符。在现实世界中,a,b,c 是字母数字单词

例子-

PAHKY.daily.csv
TYUI.GHJ.WE.daily.csv
WGGH.FGH.daily.csv
98KJL-GHR.YUI.daily.csv
67HJE.HJQ.ATD.HJ.daily.csv

如果我想列出所有类似于 PAHKY.daily.csv 的文件,其中在 daily.csv 前面只有一个文件(点是分隔符),我该怎么做?

【问题讨论】:

  • 只是ls a.daily.csvls a.b.daily.csv 不起作用?
  • 我刚刚用示例数据更新了问题。
  • 简单的echo *.daily.csv怎么样?

标签: bash ls


【解决方案1】:

如果您启用extglob 选项:

$ shopt -s extglob

您可以对零个或多个pattern 使用扩展模式匹配运算符,例如*(pattern)。知道[^.] 匹配除点以外的任何字符,这会导致:

$ ls *([^.]).daily.csv
PAHKY.daily.csv

获取所有a.daily.csv 文件。下一组:

$ ls *([^.]).*([^.]).daily.csv
WGGH.FGH.daily.csv  98KJL-GHR.YUI.daily.csv

等等。如果您想匹配pattern 中的一个或多个而不是零个或多个,请将*(pattern) 替换为+(pattern)

【讨论】:

    【解决方案2】:

    你将 grep 与 ls 一起使用,因为 grep 与正则表达式配合得很好 试试这样的,

    ^a\.b\.c\.data\.csv$
    
    ls | grep 'Your Expression'
    

    事实上,您甚至可以使用 find 而无需通过管道连接到 grep

    【讨论】:

    • 谢谢基本功能。我已经用示例数据更新了问题
    【解决方案3】:

    这应该可行:

    ls |grep -Po '([A-Za-z0-9\-\.]?)+.daily.csv'
    

    说明:

    -P, --perl-regexp
    -o, --only-matching
    [A-Za-z0-9\-\.] --match the group of characters : (A-Z,a-z,0-9,-,.)
    ()  -- to capture a group
    ?   -- matches zero or one of the previous RE.
    +   -- matches one or more of the previous RE
    

    输出:

    67HJE.HJQ.ATD.HJ.daily.csv
    98KJL-GHR.YUI.daily.csv
    PAHKY.daily.csv
    TYUI.GHJ.WE.daily.csv
    WGGH.FGH.daily.csv
    

    【讨论】:

      猜你喜欢
      • 2019-05-02
      • 2011-08-08
      • 1970-01-01
      • 2010-09-22
      • 2012-12-24
      • 2015-05-05
      • 2014-05-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多