2341a.po
、などの4567211someword.po
数値名を持つファイルがあります。0012.po
数値範囲に基づいてファイルセットを探したいです。たとえば[126 - 363]
。
通常、私は正規表現を使用しますfind
。すべての数値範囲は、2つの正規表現で構成できます[N, M]
。larger than N
less than M
Nより大きい:
もしそうなら、まずは誰にでもN = vxyz
マッチします。value > V000, (V=v+1)
[V-9]\d{3,}
次にvX00
、、、、X=x+1
v[X-9]\d\d
次にvxY0
、、、、Y=y+1
vx[Y-9]\d
ついにvxy[z-9]
例:
一致させるには、number>=234
次を使用します。
`^(0*([3-9]\d{2,}|2[4-9]\d|23[4-9]))`
M未満:
同様のロジックに基づいて、次のような結果が得られます。
^(0*(vxy[0-z]|vx[0-Y]\d|v[0-X]\d\d|[1-V]\d\d|\d{1,3}))[^0-9]
そしてY=y-1,X=x-1,V=v-1
たとえば、次のコマンドは [253, 326] の間のすべてのファイルを検索します。
find . -maxdepth 1 -type f -regextype posix-extended -iregex '^\./0*([3-9][0-9]{2,}|2[6-9][0-9]{2,}|25[3-9]).*' -iregex '^\./0*(32[0-6]|3[0-1][0-9]|[0-2][0-9][0-9]|[0-9]{1,2})[^0-9].*'
しかし、このアプローチは長い数字を扱うにはあまりにも迷惑です。これを行うより良い簡単な方法はありますか?
ベストアンサー1
そしてzsh
:
setopt extendedglob # best in ~/.zshrc
ls -ld -- <126-253>(*.po~[0-9]*)
つまり、10進数126〜253(000126も許可されています)、その後に.po
10進数で終わり、10進数で始まらない数字が続きます。
隠しディレクトリと通常のファイルのみを含む再帰的に:
ls -ld -- **/<126-253>(*.po~[0-9]*)(D.)
会っzargs
たらarg list too long
間違い。
リテラル数の代わりに変数を使用したい場合は、これを行うことはできません。この<$low-$high>
<x-y>
演算子は、リダイレクト演算子(echo <3-4> z
POSIXシェルではファイルecho
から3-
リダイレクトされた入力として実行され、fd 4で入力z
)と重なり、zsh
リテラル数だけを許可して競合のリスクを最小限に抑えるようにします。ただし、この演算子をglobsubst
ing拡張の一部として使用できます。たとえば、次のようになります。
low=126 high=253
ls -ld -- ${~:-"<$low-$high>"}(*.po~[0-9]*)
有効${~expansion}
(globsubst
拡張にワイルドカードを使用することを許可)は、任意の拡張を拡張できるようにする特別な形式expansion
です。${:-"text"}
${var:-default}
text