2011-01-10 12 views
7

tengo este comando:expresión regular para los dígitos en Unix encontrar comando

find reports/ -type f -mtime +90 -regex ".*\.\(csv\|sql\|txt\|xls\|zip\)" 

Y necesito a la carne hacia arriba de modo que la pieza antes de las extensiones de archivo coincide con un patrón YYYY/MM/DD, así:

reports/2010/10/10/23.txt 
reports/2010/10/10/23.xls 
reports/2010/10/10/26.csv 
reports/2010/10/10/26.sql 
reports/2010/10/10/26.txt 
reports/2010/10/10/26.xls 
reports/2010/10/10/27.csv 

Pero no obtengo ninguna permutación de \d y los parientes escapan al trabajo.

ACTUALIZACIÓN: esto es lo que funcionó para mí en base a la respuesta aceptada a continuación:

find reports/ -type f -mtime +90 -regex "reports/201[01]/\([1-9]\|1[012]\)/\([1-9]\|[12][0-9]\|3[01]\)/.*\.\(csv\|sql\|txt\|xls\|zip\)" 
+0

Tenga en cuenta que la opción -regex no es estándar en las plataformas Unix. Creo que solo puede estar en GNU find. Puede hacer un método más estándar conectando la salida a egrep. – JOTN

Respuesta

5

Esto es lo que he utilizado en el pasado:

Year: (19|20)[0-9][0-9] 
Month: 0[1-9]|1[012] 
Day: (0[1-9]|[12][0-9]|3[01]) 

Puede poner estos juntos en tu expresión regular Por supuesto, tendrá que escapar de los soportes y las tuberías.

3

\d es una extensión de expresiones regulares que no es compatible con las expresiones regulares de Emacs y expresiones regulares POSIX (esas son las sabores find soportes). Puede usar [[:digit:]] o [0-9] en su lugar.

+1

Puede usar '[0-9]', pero si puede usar '[[: digit:]]' depende de '-regextype' que use. Por ejemplo, 'emacs' (el tipo predeterminado) no lo admite, mientras que' posix-extended' sí lo admite. Consulte [Manual de GNU findutils: 8.5 Regular Expressions] (https://www.gnu.org/software/findutils/manual/html_node/find_html/Regular-Expressions.html) para las descripciones de sintaxis vinculadas en la parte inferior. – zpea

3

El siguiente es feo y no eliminar a fechas no válidas, pero podría ser lo suficientemente cerca:

find reports/ -type f -regex ".*/reports/[0-9][0-9][0-9][0-9]/[0-9][0-9]/[0-9][0-9]/[0-9][0-9]\.\(csv\|sql\|txt\|xls\|zip\)" 
+0

Eso se ve bien (y lo probaré en un momento) pero ¿es posible ajustar los rangos con algo como "[0-9] {4}" en lugar de repetirlo cuatro veces seguidas? –

+0

El cuantificador numérico "{4}" no parece funcionar con la versión de 'regexec' en la versión de' libc' utilizada por 'find' en mi sistema (libc 2.3.4). YMMV. –

0

Puede utilizar los repetidores de la siguiente manera:

find ./ -regextype posix-egrep -iregex ".*\._[0-9]{8}-[0-9]{6}.*" 

Lo utilizo para encontrar copias de seguridad de la forma:

./foo._20140716-121745.OLD 

Dónde foo es el nombre original y los números son la fecha y la hora .

(en CentOS 6.5)

P.S. -regextype posix-extended funciona también.

Cuestiones relacionadas