首页 > 解决方案 > bash 列出特定命名约定的文件

问题描述

操作系统 - Linux (Ubuntu 20.04)

我有一个包含数千个文件的目录。文件名范围从 a.daily.csv 到 abdaily.csv 到 abcdaily.csv 到 abcddaily.csv 到 abcddaily.csv

我面临的挑战是仅列出 a.daily.csv 或 abdaily.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 前面只有一个文件(点是分隔符),我该怎么做?

标签: bashls

解决方案


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


推荐阅读