Regular-Expression
在文件名中有數字的文件的目錄中,如何找到大於或小於 x 的文件
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'
但如何更好地做到這一點?
使用
zsh
shell,globbing 模式part2/<128-299>.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/<128-299>.txt part2/145.txt part2/233.txt
在類似的 shell
bash
中,下面的一組模式會做同樣的事情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
使用,您將使用與非shell
find
中相同類型的模式: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 == <128-299>.txt ]]' zsh {} \; -print
這將為每個找到的路徑名呼叫一個內聯
zsh
腳本,並使用類似於此答案開頭的 on 的模式比較其文件名。
find
顯然也會遞歸到下面的子目錄中part2
。