cómo encontrar files según el range del nombre del file?

Tengo algunos files con nombres numéricos: 2341a.po , 4567211someword.po , 0012.po , etc. Me gustaría encontrar un set de files basados ​​en el range numérico. como [126 - 363] .

Normalmente uso expresiones regulares con find . Cualquier range numérico [N, M] se puede componer con dos expresiones regulares larger than N y less than M

El más grande que N:

Si N = vxyz , primero hago una coincidencia para todo el value > V000, (V=v+1) con [V-9]\d{3,}

Luego, vX00 coincidir vX00 , X=x+1 , con v[X-9]\d\d

Luego vxY0 coincidir vxY0 , Y=y+1 , con vx[Y-9]\d

Y el último vxy[z-9]

Ejemplo:

Para hacer coincidir el number>=234 , utilizo:

 `^(0*([3-9]\d{2,}|2[4-9]\d|23[4-9]))` 

El más pequeño que M:

En base a una lógica similar tendremos:

 ^(0*(vxy[0-z]|vx[0-Y]\d|v[0-X]\d\d|[1-V]\d\d|\d{1,3}))[^0-9] 

Con Y=y-1,X=x-1,V=v-1

Por ejemplo, el siguiente command encontrará cualquier file entre [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].*' 

Sin embargo, este método es demasiado molesto para manejar numbers largos. ¿Hay alguna manera mejor y más fácil de hacer esto?

Con zsh :

 setopt extendedglob # best in ~/.zshrc ls -ld -- <126-253>(*.po~[0-9]*) 

Recursivamente, incluso en directorys ocultos y solo files regulares:

 ls -ld -- **/<126-253>(*.po~[0-9]*)(D.) 

use zargs si se encuentra con el error arg list too long .

Puede generar una list de files con los numbers que desea encontrar y ponerlos en la list de arguments para find utilizando xargs . Por ejemplo, usando bash , el equivalente a usar -maxdepth 1 como en la pregunta sería:

 echo {253..326} | xargs sh -c 'find "$@" -type f -maxdepth 0' sh 

Tenga en count que puede usar la opción -I para xargs (es decir, xargs -I{} find {} -type f ), pero GNU xargs fuerza -L 1 con esta opción, lo que significa que se inicia un process de búsqueda por separado para cada argumento. El uso de sh soluciona este problema.

Para una profundidad arbitraria que puedes hacer:

 printf -- '-o -name %d ' {254..326} | xargs -n 3000 sh -c 'find -type f \( -name 253 "$@" \)' sh 

El argumento -n (número máximo de arguments agregados por command) debe elegirse de modo que limitará el tamaño de la list de arguments construcciones xargs . Si es demasiado grande, se puede llegar al límite debido al tamaño total de la list de arguments en lugar de a la cantidad de arguments. Debe ser un múltiplo de 3 para que no se quede con un -o o -name en la list.

Una extensión de fuerza bruta en la respuesta de Graeme:

 find . -type f -regextype posix-awk -regex ".*/0*($(seq -s'|' 254 456)).*" 

Puedes usar \| en lugar de | y \(\) lugar de () si necesita POSIX (pero entonces, seq no es POSIX, ¿verdad?).

 $ find . -maxdepth 2 -type f -regextype posix-awk -regex ".*/0*($(seq -s'|' 254 456)).*" ./.fontconfig/3047814df9a2f067bd2d96a2b9c36e5a-le32d4.cache-3 ./.fontconfig/3830d5c3ddfd5cd38a049b759396e72e-le32d4.cache-3 ./.fontconfig/385c0604a188198f04d133e54aba7fe7-le32d4.cache-3 ./Documents/374620-63301.pdf ./4567211someword.po 

Hmm. Parece que deberíamos agregar un carácter que no sea un dígito para marcar el final del número. Quizás ".*/0*($(seq -s'|' 254 456))[^0-9].*" ?

 find | perl -ne 'print if(m!^\./(\d+)! and $1 > 126 and $1 <363)' 

… posiblemente agregando algunas de las buenas ideas presentadas en las otras respuestas.

Regex puede necesitar algunos ajustes (por ejemplo: ^\./(\d+)\w*.po$ )