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
操作系统 - 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