Usuń pliki starsze niż 500 dni

10

Mam katalog z plikami z 2010 roku. Chcę usunąć wszystkie pliki starsze niż 500 dni i próbowałem:

find /var/log/arc/* -type f -mtime +500 -delete {}\;      

Ale dostaję to:

-bash: /usr/bin/find: Argument list too long

Jak wiem, oznacza to, że plików jest zbyt wiele i findnie mogę ich obsłużyć. Ale nawet jeśli podam, że mam +2000ponad 3 lata, nadal to dostaję.

Czego tu brakuje?

Garg
źródło
1
unix.stackexchange.com/a/239268/116858 (patrz także komentarz)
Kusalananda

Odpowiedzi:

18

Tęsknisz za tym, findże nie potrzebujesz listy plików jako danych wejściowych. Problem polega na tym, że glob /var/log/arc/*rozszerza się do zbyt wielu plików. Jednak finddomyślnie będzie się powtarzał w podkatalogach, więc nie trzeba w ogóle używać glob:

find /var/log/arc/ -type f -mtime +500 -delete

-deletejest niestandardowym predykatem. Jeśli twoja findimplementacja go nie obsługuje, możesz użyć:

find /var/log/arc/ -type f -mtime +500 -exec rm -f {} +

zamiast.

terdon
źródło
Dziękuję, ale teraz dostałem to: find: invalid predicate -delete
Garg
1
@Garg najpierw przepraszam, właśnie skopiowałem twoje polecenie i nie zauważyłem, że twoja składnia jest nieprawidłowa. -deleteNie bierze {}. Zobacz aktualizację. Jednak twój komunikat o błędzie wydaje się sugerować, że twoja wersja findnie obsługuje -delete. Jeśli nie używasz GNU find(czego w większości przypadków nie zrobisz, chyba że używasz Linuksa), musisz użyć -exec -rm {} \;zamiast tego.
terdon
Dziękuję Ci. -exec rm {} \;Zrób sztuczkę.
Garg
1
@ Hobbs Nie rozumiem, dlaczego nie, -execjest zdefiniowany przez POSIX .
terdon
@terdon mój błąd.
hobbs