Jak wykryć nowe pliki w folderze ze skryptem bash ? Chciałbym przetworzyć pliki, jak tylko zostaną utworzone w folderze. Czy to możliwe, czy muszę zaplanować skrypt z cronem, który co minutę sprawdza nowe pliki?
shell
filesystems
files
directory
monitoring
ihatetoregister
źródło
źródło
Odpowiedzi:
Powinieneś rozważyć użycie
inotifywait
jako przykładu:W Ubuntu
inotifywait
zapewniainotify-tools
pakiet. Od wersji 3.13 (bieżącej w Ubuntu 12.04)inotifywait
będzie zawierać nazwę pliku bez opcji -f. Starsze wersje mogą wymagać przymusu. Należy zauważyć, że-e
opcjainotifywait
jest najlepszym sposobem filtrowania zdarzeń. Ponadto twojeread
polecenie może przypisać dane wyjściowe pozycji do wielu zmiennych, które możesz użyć lub zignorować. Nie ma potrzeby używania grep / sed / awk do wstępnego przetwarzania danych wyjściowych.źródło
inotifywait
Było tylko to, co chciałem.The '--filename' option no longer exists. The option it enabled in earlier versions of inotifywait is now turned on by default.
Więc musisz tylko zrobić,inotifywait -m /path -e create |
ja spróbuję edytować tę odpowiedź.fswatch
. Nie napisałem tego, ale jest to oprogramowanie typu open source i korzystam z niego.Wolę
incron
, ponieważ jest łatwiejszy w zarządzaniu. Zasadniczo jest to usługa, która wykorzystujeinotify
i możesz konfigurować konfiguracje, aby podejmować działania w oparciu o operacje zmiany plików.Dawny:
Pełny przykład możesz zobaczyć tutaj: http://www.cyberciti.biz/faq/linux-inotify-examples-to-replicate-directories/
źródło
Właśnie to ugotowałem i nie widzę z tym żadnych większych problemów, poza niewielką szansą na brakujące pliki między czekami.
Jeśli przetwarzanie pliku nie trwa zbyt długo, nie możesz przegapić żadnego nowego pliku. Możesz także przedstawić działania w tle ... Nie jest to kuloodporne, ale służy pewnym celom bez zewnętrznych narzędzi, takich jak inotify.
źródło
inotify
nie jest dostępne. Dodałbym,-type f
aby odfiltrować tylko pliki. W przeciwnym razie folder również zostanie zwrócony.-f filename
opcja jest świetna. Pozostaje więc tylko pytanie, jak to zrobić, aby ponownie uruchomić komputer. Zamierzam użyć tego z moją elektrownią słoneczną, abyos.system("ssh me@mysystem ' ( touch /home/me/alarms/low24 ) '")
następnie utworzenie tego pliku spowodowało, że komputer główny użyjeespeak
i ogłosi niskie napięcie. Już wysyła mi wiadomość e-mail, ale ponieważ mój system już mówi godzinę w szczycie, ma całą resztę. askubuntu.com/questions/977613/…Możesz użyć
watch
w swoim skrypcieMonitoruje folder i wyświetla wszystko w nim co 0,1 sekundy
Wada
To nie jest czas rzeczywisty, więc jeśli plik został utworzony i usunięty w mniej niż 0,1 sekundy, to nie działałoby,
watch
obsługuje tylko 0,1 sekundy.źródło
Zakładam, że folder docelowy (nazywam to
isempty
dla wygody) jest pusty i czekasz na upuszczenie jednego lub więcej plików.Możesz użyć następującego polecenia:
po prostu, aby sprawdzić, czy folder jest nadal pusty, w rzeczywistości zwróci 0, jeśli nie ma nowego pliku (stąd
isempty
folder jest nadal pusty) lub, z drugiej strony, zwróci wartość większą niż 0 (w rzeczywistości liczba plików aktualnie znajdujących się w folderze).To powiedziawszy głupi test „jeśli / to” może zrobić resztę pracy:
Oczywiście
do_something
funkcja będzie musiała manipulować plikami wisempty
folderze, a następnie usunąć go (same) z samego folderu po przetworzeniu.Dodanie do tabeli crontab wiersza takiego jak poniższy uruchomi sprawdzanie raz na minutę i uruchomi
do_something
akcję, jeśli folder nie jest oczywiście pusty:źródło
ls
skryptów.find
Zamiast tego użyj prostego globowania: mywiki.wooledge.org/ParsingLsJeśli chcesz wykryć nowe pliki, przetwórz je, a na koniec usuń kontynuowane pliki, możesz użyć systemd.path . Ta metoda opiera się na inotify. Istnieje opcja DirectoryNotEmpty, więc systemd może uruchomić skrypt zawsze, gdy wykryje jakieś pliki w katalogu. Musisz pamiętać, że to zadziała tylko wtedy, gdy będziesz mógł usunąć pliki i skrypt pozostawi katalog pusty.
Najpierw przygotuj plik mymonitor.service
następnie przejdź do mymonitor.path, aby zdefiniować ścieżkę
Jeśli nazwa pliku .path jest taka sama jak nazwa usługi, nie ma potrzeby określania nazwy usługi w pliku .path.
Opiera się na monitorowaniu dostępu do plików dla manekinów
źródło
entr
Używanie
entr
to nowy sposób na zrobienie tego (jest to platforma wieloplatformowa). Uwagaentr
nie używa odpytywania, co daje ogromną przewagę nad wieloma alternatywami.Na BSD używa
pledge(2)
Możesz go zainstalować za pomocą
Możesz śledzić katalog nowych dodatków za pomocą
Opcje wyjaśnione (z dokumentów),
źródło
Bash nie może tego łatwo zrobić. Musisz w zasadzie uzyskać listę wszystkich plików w folderze i okresowo uzyskać nową listę i porównać je, aby zobaczyć, co się zmieniło.
To, czego szukasz, nazywa się inotify. Jest wbudowany w jądro Linuksa i możesz w zasadzie siedzieć i czekać, aż coś się wydarzy, w którym wraca funkcja inotify i mówi „hej, jest nowy plik o nazwie foobar”
Aby osiągnąć to, co chcesz, musisz przełączyć się na coś takiego jak Perl i użyć Linux :: Inotify2 (python prawdopodobnie również obsługuje inotify, ale jestem osobą perla).
źródło
Działa to w cygwin i Linux. Niektóre z poprzednich rozwiązań, które zapisują plik, spowodują uszkodzenie dysku. Ten scipt nie ma tego problemu:
źródło
Poniżej znajduje się skrócona wersja przykładu przepływu stosu , który przetestowałem i włączyłem do jednego z moich projektów, który wymaga monitorowania określonych katalogów.
Oto link do skryptu, który używa zmodyfikowanej wersji powyższej do automatycznego odszyfrowywania plików lub katalogów znajdujących się w punkcie montowania sshfs; wyżej wspomniany projekt.
źródło