Regular-Expression

在文件名中有數字的文件的目錄中,如何找到大於或小於 x 的文件

  • July 31, 2021

OUT-OF-CONTEXT(只是一個比較來說明“我想做什麼”):查詢數據庫時,什麼時候可以選擇where id > 5 and id < 99……

CONTEXT-part1 :在一個有很多文件的目錄中。

CONTEXT-part2 :文件名類似於 123.txt 145.txt 233.txt 678.txt (不按順序)

我想做什麼:查找(在文件名中)大於 127 且小於 300 的文件

範例:在“part2”中找到 145.txt 233.txt

我開始嘗試什麼:find . -regextype sed -regex '.*/[1-9].ref'

但如何更好地做到這一點?

使用zshshell,globbing 模式part2/&lt;128-299&gt;.txt將匹配part2目錄中以嚴格介於 127 和 300 之間的數字開頭並以 string 結尾的所有名稱.txt

例子:

$ tree
.
|-- part1
|   |-- 123.txt
|   |-- 145.txt
|   |-- 233.txt
|   `-- 678.txt
`-- part2
   |-- 123.txt
   |-- 145.txt
   |-- 233.txt
   `-- 678.txt

2 directories, 8 files
$ printf '%s\n' part2/&lt;128-299&gt;.txt
part2/145.txt
part2/233.txt

在類似的 shellbash中,下面的一組模式會做同樣的事情

part2/12[89].txt part2/1[3-9][0-9].txt part2/2[0-9][0-9].txt

前提nullglob是設置了 shell 選項,否則您可能會得到未擴展的模式:

$ printf '%s\n' part2/12[89].txt part2/1[3-9][0-9].txt part2/2[0-9][0-9].txt
part2/12[89].txt
part2/145.txt
part2/233.txt
$ shopt -s nullglob
$ printf '%s\n' part2/12[89].txt part2/1[3-9][0-9].txt part2/2[0-9][0-9].txt
part2/145.txt
part2/233.txt

nullglob在沒有(例如)的外殼sh中,您將不得不使用循環來測試每個生成的字元串是否存在:

for name in part2/12[89].txt part2/1[3-9][0-9].txt part2/2[0-9][0-9].txt
do
   [ -e "$name" ] && printf '%s\n' "$name"
done

使用,您將使用與非shellfind中相同類型的模式:zsh

find part2 -name '12[89].txt' -o -name '1[3-9][0-9].txt' -o -name '2[0-9][0-9].txt'

但你顯然zsh也可以在這裡使用,

find part2 -exec zsh -c '[[ $1:t == &lt;128-299&gt;.txt ]]' zsh {} \; -print

這將為每個找到的路徑名呼叫一個內聯zsh腳本,並使用類似於此答案開頭的 on 的模式比較其文件名。

find顯然也會遞歸到下面的子目錄中part2

引用自:https://unix.stackexchange.com/questions/662737