2011-10-30 6 views
9

Sto cercando di utilizzare inotifywait per guardare tutti .js file sotto la mia directory ~/js; come posso formattare la mia espressione regolare nel seguente comando?inotifywait - esclude schema di espressione regolare formattazione

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

La regex - secondo la pagina man, dovrebbe essere di POSIX estesa espressione regolare - ha la necessità di abbinare "tutti i file ad eccezione di quelli che termina in .js", in modo che questi file possono in essere escluso dall'opzione --exclude.

Ho provato la cosa (?!), Ma in questo caso non sembra funzionare. Qualche idea o soluzione alternativa? Apprezzerei molto il tuo aiuto su questo argomento.

+2

Non è necessario utilizzare '-r' o' --exclude'. Esegui semplicemente: 'inotifywait -m ~/js/*. Js' – ostrokach

risposta

6

Ho provato il (?!) Cosa

Questa cosa si chiama lookahead negativo e non è supportato da POSIX ERE.

Quindi devi farlo nel modo più difficile, cioè abbinare tutto ciò che vuoi escludere.

ad es.

\.(txt|xml) ecc

+1

È possibile farlo usando il [^] metachar? Ho provato. *? [^ \.] [^ J] [^ s] $ ....... Non funziona come previsto. – gsklee

+1

No, non puoi. E funziona come previsto. – FailedDev

3

ho postato una patch qui che aggiunge le opzioni --include e --includei che funzionano come negazioni di --exclude e --excludei:

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

Ovviamente si Dovrei ricostruire gli inotifytools, e questo è relativamente non testato, ma si spera che possa renderlo disponibile per la mainline o che sia utile a qualcuno che si imbatte in questo post in seguito.

+0

Ho aggiornato un po 'la patch di regex e l'ho aggiunta ad Alpine Linux come inotify-tools-inc http://git.alpinelinux.org/cgit/aports/commit/?id=7ee2363baf3fda4d5e66ae285a658b73d1fdd281 –

1

Assicurarsi di indicare il comando regex, se si utilizzano caratteri rilevanti per la shell (incluso ()).

Mentre questo sta lavorando:

inotifywait --exclude \.pyc . 

questo non è:

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

Bisogna citare l'intera espressione regolare:

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

inotifywait non ha opzione include e POSIX le espressioni regolari estese non supportano la negazione. (Risposta da FailedDev)

È possibile applicare una patch agli strumenti di inotify per ottenere un'opzione --include. Ma devi compilarlo e mantenerlo da solo. (Risposta di browndav)

Una soluzione più rapida è l'utilizzo di grep.

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

Ma attenzione al buffering di grep se si reimposta l'output su altri comandi.Aggiungi --line-buffered per farlo funzionare con while read. Ecco un esempio:

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

Se si desidera solo per guardare i file già esistenti, è anche possibile utilizzare find per generare l'elenco dei file. Non guarderà i file appena creati.

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

Se tutti i file sono in una directory, è possibile utilizzare anche il suggerimento ostrokach s'. In questo caso l'espansione della shell è molto più semplice di find e xargs. Ma ancora, non guarderà i file appena creati.

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

Si potrebbe ottenere la maggior parte di questo con --exclude '\.[^j][^s]' di ignorare i file a meno che non contengano .js ad un certo punto nel nome del file o il percorso. Se lo abbini a -r allora funzionerà con livelli arbitrari di nidificazione.

L'unico svantaggio è che i nomi di file come test.js.old verranno comunque guardati e tutti i file all'interno di una directory denominata example.js/ verranno guardati, ma probabilmente è un po 'improbabile.

Probabilmente si potrebbe estendere questa espressione regolare per risolvere questo problema ma personalmente non penso che gli svantaggi siano un grande abbastanza di un affare di cui preoccuparsi.