bash 列出特定命名约定的文件

bash list files of a particular naming convention

操作系统 - 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 等是我用来 post 问题的占位符。在现实世界中,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 前面,我该怎么做?

您将 grep 与 ls 结合使用,因为 grep 与正则表达式配合使用效果很好 尝试这样的事情,

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

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

如果启用 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)

这应该有效:

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