2011-10-30 12 views
9

Estoy tratando de utilizar inotifywait para ver todos los Js archivos bajo mi directorio ~/js; ¿Cómo formateo mi expresión regular dentro del siguiente comando?inotifywait - excluir patrón de expresión de formatear

$ inotifywait -m -r --exclude [REGEX HERE] ~/js

La expresión regular - de acuerdo a la página del manual, debe ser de POSIX expresiones regulares extendidas - debe coincidir con "todos los archivos excepto aquellos que termina en Js", por lo que estos archivos pueden en se excluirá por la opción --exclude.

He intentado el (?!) Lookaround, pero parece que no funciona en este caso. ¿Alguna idea o solución? Agradecería mucho su ayuda en este tema.

+2

No necesita utilizar '-r' o' --exclude'. Simplemente ejecuta: 'inotifywait -m ~/js/*. Js' – ostrokach

Respuesta

6

he probado el (?!) Lo

Esta cosa se llama búsqueda negativa hacia delante y no es compatible con POSIX ERE.

Así que tienes que hacerlo de la manera difícil, es decir, coincide con todo lo que quieras excluir.

p. Ej.

\.(txt|xml) etc.

+1

¿Es posible hacerlo usando el metacarpo [^]? Lo intenté. *? [^ \.] [^ J] [^ s] $ ....... No funciona como estaba previsto tampoco. – gsklee

+1

No, no puedes. Y funciona como se esperaba. – FailedDev

3

he publicado un parche que añade opciones aquí --include y --includei que funcionan como negaciones de --exclude y --excludei:

https://github.com/browndav/inotify-tools/commit/160bc09c7b8e78493e55fc9f071d0c5575496429

Obviamente Tendría que reconstruir inotifytools, y esto es relativamente no probado, pero con suerte puede hacerlo en mainline o es útil para alguien que se encuentre con esta publicación más tarde.

+0

Actualicé un poco el parche de actualización de expresiones regulares y lo agregué a Alpine Linux como inotify-tools-inc http://git.alpinelinux.org/cgit/aports/commit/?id=7ee2363baf3fda4d5e66ae285a658b73d1fdd281 –

1

Asegúrese de estar citando el comando de expresión regular, si está utilizando caracteres relevantes para el shell (incluido ()).

Mientras que esto está funcionando:

inotifywait --exclude \.pyc . 

esto no es:

inotifywait --exclude (\.pyc|~) . 

Hay que citar la expresión regular completa:

inotifywait --exclude '.*(\.pyc|~)' . 
7

inotifywait no tiene opción y POSIX incluyen expresiones regulares extendidas no admiten la negación. (Respondido por FailedDev)

Puede parchar las herramientas de inotify para obtener una opción --include. Pero debes compilarlo y mantenerlo tú mismo. (Respondido por browndav)

Una solución más rápida es usar grep.

$ inotifywait -m -r ~/js | grep '\.js$' 

Pero tenga en cuenta el almacenamiento en memoria intermedia de grep si canaliza la salida a otros comandos.Agregue --line-buffered para que funcione con while read. Aquí está un ejemplo:

$ inotifywait -m -r ~/js | grep '\.js$' --line-buffered | 
    while read path events file; do 
     echo "$events happened to $file in $path" 
    done 

Si lo que desea es ver archivos ya existentes, también se puede utilizar para generar find la lista de archivos. No verá los archivos recién creados.

$ find ~/js -name '*.js' | xargs inotifywait -m 

Si todos sus archivos están en un directorio, también se puede utilizar la sugerencia de ostrokach 's. En ese caso, la expansión de shell es mucho más fácil que find y xargs. Pero, de nuevo, no verá los archivos recién creados.

$ inotifywait -m ~/js/*.js 
1

Usted podría conseguir la mayor parte de esto con --exclude '\.[^j][^s]' hacer caso omiso de los archivos a menos que contengan .js en algún momento en el nombre del archivo o la ruta. Si lo combina con -r, funcionará con niveles arbitrarios de anidación.

El único inconveniente es que se seguirán viendo los nombres de archivo como test.js.old y también se verán todos los archivos dentro de un directorio llamado example.js/, pero esto es probablemente poco probable.

Probablemente podría ampliar esta expresión regular para solucionar esto, pero personalmente no creo que los inconvenientes sean lo suficientemente grandes como para preocuparse.

Cuestiones relacionadas