2011-10-30 20 views
9

Próbuję użyć inotifywait oglądać wszystkie Js plików w moim katalogu ~/js; jak sformatować moje wyrażenie regularne wewnątrz następującego polecenia?inotifywait - wyklucza regex wzór formatowania

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

regex - według strony człowieka, powinny być rozszerzone wyrażenia regularne POSIX - musi odpowiadać „wszystkie pliki z wyjątkiem tych, które kończy się w js”, więc te pliki mogą w wyłączyć, wyłączając opcję --exclude.

Próbowałem (?!) Obejść, ale nie wydaje się działać w tym przypadku. Wszelkie pomysły lub obejścia? Bardzo dziękuję za pomoc w tej sprawie.

+2

Nie trzeba używać '-r' ani' --exclude'. Po prostu uruchom: 'inotifywait -m ~/js/*. Js' – ostrokach

Odpowiedz

6

Próbowałem coś

(?!) To coś nazywa się ujemne uprzedzona i nie jest obsługiwany przez POSIX ERE.

Musisz więc zrobić to w trudny sposób, tzn. Dopasować wszystko, co chcesz wykluczyć.

np.

\.(txt|xml) itp

+1

Czy można to zrobić za pomocą metazara [^]? Próbowałem. *? [^ \.] [^ J] [^ s] $ ....... Nie działa tak, jak powinien. – gsklee

+1

Nie, nie możesz. I działa zgodnie z przeznaczeniem. – FailedDev

3

Zamieściłem tutaj patch, który dodaje --include i --includei opcje, które działają jak negacji --exclude i --excludei:

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

Oczywiście ty Musiałby odbudować inotifytools, a to jest względnie nieprzetestowane, ale mam nadzieję, że może to zrobić w głównej linii lub jest pomocne dla kogoś, kto natknie się na ten post później.

+0

Zaktualizowałem trochę łatkę regex i dodałem ją do Alpine Linux jako inotify-tools-inc http://git.alpinelinux.org/cgit/aports/commit/?id=7ee2363baf3fda4d5e66ae285a658b73d1fdd281 –

1

Upewnij się, że cytujesz polecenie regex, jeśli używasz znaków istotnych dla powłoki (w tym ()).

Choć pracuje:

inotifywait --exclude \.pyc . 

to nie jest:

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

Musisz podać całą wyrażenia regularnego:

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

inotifywait ma nie zawierać opcję i POSIX rozszerzone wyrażenia regularne nie obsługują negacji. (Odpowiedź: FailedDev)

Możesz załatać narzędzia inotify, aby uzyskać opcję --include. Ale musisz sam je skompilować i utrzymać. (Odpowiedź: browndav)

Szybszym rozwiązaniem jest użycie grep.

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

Należy jednak pamiętać o buforowaniu grepa, jeśli potrąca się wyjście do innych poleceń.Dodaj --line-buffered, aby zadziałało z while read. Oto przykład:

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

Jeśli chcesz tylko oglądać już istniejących plików, można również użyć find wygenerować listę plików. Nie będzie oglądać nowo utworzonych plików.

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

Jeżeli wszystkie pliki w jednym katalogu, można również użyć sugestię ostrokach „s. W takim przypadku rozszerzenie powłoki jest znacznie łatwiejsze niż find i xargs. Ale znowu nie będzie oglądać nowo utworzonych plików.

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

Można dostać większość tego z --exclude '\.[^j][^s]' ignorowanie plików, o ile nie zawierają .js w pewnym momencie w nazwie pliku lub ścieżki. Jeśli połączysz go z -r, będzie działał z dowolnymi poziomami zagnieżdżania.

Jedyną wadą jest to, że nazwy plików takie jak test.js.old będą nadal oglądane i wszystkie pliki w katalogu o nazwie example.js/ również będą oglądane, ale jest to prawdopodobnie mało prawdopodobne.

Prawdopodobnie można rozszerzyć to wyrażenie, aby to naprawić, ale osobiście nie uważam, że wady są wystarczająco duże, aby się o nie martwić.