Widziałem tę odpowiedź .
Jako przykład należy rozważyć użycie inotifywait:
inotifywait -m /path -e create -e moved_to | while read path action file; do echo "The file '$file' appeared in directory '$path' via '$action'" # do something with the file done
Moje pytanie brzmi: powyższy skrypt obserwuje katalog do tworzenia plików dowolnego typu, ale jak zmodyfikować inotifywait
polecenie, aby raportowało tylko wtedy, gdy plik określonego typu / rozszerzenia zostanie utworzony (lub przeniesiony do katalogu) - np. Powinien zgłoś, kiedy .xml
utworzony zostanie dowolny plik.
CO SPRÓBOWAŁEM:
Uruchomiłem inotifywait --help
polecenie i przeczytałem opcje wiersza polecenia. Ma --exclude <pattern>
i --excludei <pattern>
poleceń WYKLUCZAJă pliki niektórych typów (przy użyciu regex), ale muszę sposób obejmować tylko pliki określonego typu / rozszerzenia.
shell-script
shell
filesystems
monitoring
inotify
Nieśmiały
źródło
źródło
path
powyższego prawdopodobnie nie jest najlepszą nazwą zmiennej, jeśli chcesz grać z tym pierwszym w powłoce. Jeśli go użyjesz, nie będziesz w stanie używać poleceń i wszystkiego, ponieważ to po prostu przesłoniło standardPATH
. Dlatego zalecam użycie alternatywnej nazwy var, takiej jakfpath
zamiast. tj.while read fpath action file
wtedy każde standardowe polecenie zwykle dostępne z twojej powłoki nadal będzie.Odpowiedzi:
Pamiętaj, że jest to kod niesprawdzony, ponieważ nie mam
inotify
teraz dostępu do niego . Ale coś podobnego powinno działać:źródło
incron
(mam nadzieję, że nie).inotify
albo znohup
niestandardową usługą systemową. Najczęściej ten drugi.Użyj podwójnego ujemnego:
Dotyczy to tylko plików javascript
źródło
inotifywait
zamiast generowania ogromnych wyników dla wszystkich plików, a następnie filtruje (jak w drugiej odpowiedzi). Nie próbowałem, ale myślę, że działałoby to trochę szybciej.--exclude
wejściowe, aby szukać.ext
plików. Jest to uruchamiane tylko raz lub w pętli for?inotifywait -m --exclude "[^.][^e][^x][^t]$" /home/jonas/Skrivbord/test -e create -e moved_to | while read path action file; do echo "The file '$file' appeared in directory '$path' via '$action'" done
Jestem pewien, że wyrażenie regularne można zoptymalizować, ale to dziecko działa :)Chociaż podejście podwójnie negatywne z poprzedniej odpowiedzi jest dobrym pomysłem, ponieważ (jak zauważył TMG) rzeczywiście zmienia ono zadanie filtrowania
inotifywait
, nie jest poprawne.Na przykład, jeśli plik się kończy,
as
to nie będzie pasował,[^j][^s]$
ponieważ ostatnia literas
nie pasuje[^s]
, dlatego nie zostanie wykluczony.W języku boolowskim, jeśli
S
jest to zdanie:i
J
jest stwierdzeniem:wówczas wartość
--exclude
parametru powinna być semantycznie równanot(J and S)
, co według praw De Morgana jestnot(J) or not(S)
.Innym potencjalnym problemem jest to, że
zsh
,$path
jest wbudowany w zmiennej reprezentującej odpowiednik tablicy$PATH
, więcwhile read path ...
linia będzie całkowicie bałagan$PATH
i wszystko by stać się przyczyną unexecutable z powłoki.Dlatego prawidłowe podejście to:
Zwróć uwagę na
.
to, co jest potrzebne po,[^j]
aby upewnić się, że dopasowanie zostanie zastosowane w przedostatniej pozycji, a także, że|
znak (reprezentujący wartość logiczną OR wspomnianą powyżej) nie powinien być tutaj zastępowany, ponieważ--exclude
przyjmuje rozszerzone wyrażenia regularne POSIX.źródło