Możesz spróbować czegoś takiego:
find /tmp -mtime +7 -and -not -exec fuser -s {} ';' -and -exec echo {} ';'
find służy do wyszukiwania plików spełniających określone kryteria.
-mtime +7 wybiera tylko pliki starsze niż 7 dni (możesz użyć dowolnej innej wartości)
-exec fuser -s {} ';'wywołuje fuser w trybie cichym dla każdego pliku, który spełnia kryteria starości. fuser zwraca 0 (= prawda) dla każdego pliku, do którego uzyskano dostęp w tej chwili i 1 (= fałsz) dla plików, które nie były dostępne. Ponieważ interesują nas tylko te bez dostępu, stawiamy -notprzed tym-exec
-exec echo {} ';'po prostu drukuje wszystkie nazwy plików spełniające kryteria. możesz -exec rm {} ';'zamiast tego użyć tutaj, ale ponieważ może to usunąć niektóre nadal używane pliki, myślę, że bezpieczniej jest najpierw wykonać proste echo.
- edycja: Możesz dodać coś takiego
-name 'foo*.bar'lub -uid 123ograniczyć efekty czyszczenia do określonych wzorców plików lub identyfikatorów użytkowników, aby uniknąć przypadkowych efektów.
Do ostatniego punktu: zastanów się, że mogą istnieć pliki, które są zapisywane tylko raz (np. Przy starcie systemu), ale często czytane (np. Dowolny plik cookie sesji X). Dlatego zalecamy dodanie sprawdzania nazw, aby wpływać tylko na pliki utworzone przez wadliwe programy.
edit2:
Do twojego ostatniego pytania: Plik nie zostanie usunięty z dysku, dopóki żaden proces nie będzie miał otwartego uchwytu (przynajmniej dla rodzimych systemów plików Linux). Problem polega na tym, że pozycja katalogu jest natychmiast usuwana, co oznacza, że od momentu usunięcia pliku żadne nowe procesy nie mogą już otworzyć pliku (ponieważ nie jest do niego dołączona nazwa pliku).
Aby uzyskać szczegółowe informacje, patrz:
/programming/3181641/how-can-i-delete-a-file-upon-its-close-in-c-on-linux
edit3: Ale co jeśli chciałbym zautomatyzować cały proces?
Jak powiedziałem, mogą istnieć pliki, które są zapisywane raz, a następnie odczytywane co jakiś czas (np. Pliki cookie sesji X, pliki PID itp.). Nie zostanie to wykluczone przez ten mały skrypt usuwający (z tego powodu możesz chcieć wykonać test echonajpierw przed usunięciem plików).
Jednym ze sposobów wdrożenia bezpiecznego rozwiązania jest użycie atime.
atimezapisuje czas ostatniego dostępu do każdego pliku. Ale ta opcja systemu plików często jest wyłączona, ponieważ ma dość duży wpływ na wydajność (według tego bloga gdzieś w regionie 20-30%). Jest relatime, ale ten zapisuje tylko czas dostępu, jeśli mtimesię zmienił, więc ten nam nie pomoże.
Jeśli chcesz użyć atime, polecam mieć /tmposobną partycję (najlepiej ramdysk), aby wpływ na wydajność całego systemu nie był zbyt duży.
Po atimewłączeniu wystarczy zastąpić -mtimeparametr w powyższym wierszu polecenia -atime.
Możesz być w stanie je usunąć -not -exec fuser -s {} ';', ale trzymam je tam na wszelki wypadek (na wypadek, gdyby aplikacje utrzymywały pliki otwarte przez długi czas).
Pamiętaj jednak, aby przetestować polecenie, echozanim skończysz usuwać rzeczy, których system nadal potrzebuje!