[英]bash list files of a particular naming convention
操作系統 - Linux (Ubuntu 20.04)
我有一個包含數千個文件的目錄。 文件名范圍從 a.daily.csv 到 abdaily.csv 到 abc.daily.csv 到 abc.d.daily.csv 到 ab881128414141888.8
我面臨的挑戰是僅列出 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 前面只有一個文件(點是分隔符),我該怎么做?
如果啟用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)
。
您將 grep 與 ls 一起使用,因為 grep 與正則表達式配合使用效果很好嘗試這樣的操作,
^a\.b\.c\.data\.csv$
ls | grep 'Your Expression'
事實上,您甚至可以在不使用管道的情況下使用find
grep
這應該工作:
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
Output:
67HJE.HJQ.ATD.HJ.daily.csv
98KJL-GHR.YUI.daily.csv
PAHKY.daily.csv
TYUI.GHJ.WE.daily.csv
WGGH.FGH.daily.csv
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.