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 -not
przed 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 123
ograniczyć 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 echo
najpierw przed usunięciem plików).
Jednym ze sposobów wdrożenia bezpiecznego rozwiązania jest użycie atime
.
atime
zapisuje 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 mtime
się zmienił, więc ten nam nie pomoże.
Jeśli chcesz użyć atime
, polecam mieć /tmp
osobną partycję (najlepiej ramdysk), aby wpływ na wydajność całego systemu nie był zbyt duży.
Po atime
włączeniu wystarczy zastąpić -mtime
parametr 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, echo
zanim skończysz usuwać rzeczy, których system nadal potrzebuje!