Mam folder pamięci podręcznej z co najmniej 15 000 plików.
Próbowałem tego:
find cache* -mtime +30 -exec rm {} \;
Ale to spowodowało, że mój serwer poleciał do nieba!
Czy jest jakieś szybsze / lepsze rozwiązanie?
Czy mogę ograniczyć prędkość lub iteracje tego polecenia?
linux
ubuntu
command-line
find
Kristian
źródło
źródło
cache*
rozwija się do wielu plików, możesz spróbować czegoś takiegofind . -name 'cache*' -mtime +30 -exec rm {} \;
.Odpowiedzi:
Lubię używać
tmpwatch
do tych rzeczy, to jest ostatni raz, gdy plik został zmodyfikowany. To proste i działa dobrze w wielu przypadkach:W przypadku Ubuntu sprawdź
tmpreaper
zamiast tego.Jeśli chcesz sprawdzić ostatni dostęp do pliku, użyj następujących czynności:
Nie możesz używać tmpwatch -a w systemach plików montowanych z noatime. nadal możesz użyć -m
źródło
Ubuntu 10.04.2 LTS
i to polecenie nie istnieje ..tmpreaper
zamiast.Można uniknąć zaszczepiania nowego procesu dla każdego pliku za pomocą
źródło
Spróbuj uruchomić powyższe z ładnym:
W ten sposób ogromne obciążenie pojawi się tylko wtedy, gdy nic innego nie będzie musiało zostać uruchomione, w przeciwnym razie inne procesy będą miały pierwszeństwo (jeśli ich liczba jest mniejsza niż 19, tj. Maksymalna).
Zauważ, że argument opcji -n jest dodawany do domyślnej niceness, która waha się między -20 a 19. Użyłem 39, więc będzie bardzo przyjemnie, niezależnie od tego, jaka była pierwotna niceness.
źródło
Jak skomentował chiborg, obciążenie wynika z uruchomienia rm dla każdego znalezionego pliku. Zauważyłem odpowiedź, która
tmpwatch
jest sugerowana jako alternatywa, która z pewnością działa dobrze. Nie jest to jednak konieczne.Find może uruchomić polecenie wydane jednokrotnie, jeśli powiesz mu, aby zgromadziło znalezione pliki na liście takich argumentów:
Czasami może to nie działać, ponieważ lista argumentów może być większa (w bajtach) niż maksymalna dozwolona przez powłokę (getconf ARG_MAX). Można to rozwiązać za pomocą xargs z opcją -L.
rozważ ten przykład:
Więc nie ma potrzeby instalowania dodatkowego oprogramowania, wszystko czego potrzebujesz to gnu-findutils:
źródło
\+
; zwykły+
jest wystarczająco dobry. (2) To nie „nie zadziała, ponieważ lista argumentów może urosnąć…”.find … -exec … {} +
zrobi to samo, coxargs
zrobi; uruchomi polecenie tyle razy, ile będzie trzeba. Na przykład (jak w twoim przykładzie), jeśli masz od 15001 do 20000 plików,find
uruchomiłby-exec
program (drm
) cztery razy.