Jak usunąć wszystkie pliki starsze niż 3 dni, gdy „Lista argumentów jest za długa”?

89

Mam katalog plików dziennika, który zawiera 82000 plików i katalogów (około pół na pół).

Muszę usunąć wszystkie pliki i katalogi starsze niż 3 dni.

W katalogu zawierającym 37000 plików mogłem to zrobić za pomocą:

find * -mtime +3 -exec rm {} \;

Ale przy 82000 plikach / katalogach pojawia się błąd:

/ usr / bin / find: Lista argumentów jest za długa

Jak mogę obejść ten błąd, aby usunąć wszystkie pliki / katalogi starsze niż 3 dni?

Edward Tanguay
źródło
1
Czy próbowałeś find -mtime +3 -exec rm {} +?
Gilles Quenot
1
Wierzę, że bieganie find * -mtime +3 |xargs rmrozwiązałoby ten problem.
Mats Petersson
9
Myślę, że jedynym problemem jest find *. find .jest lepiej. Globowanie powłoki z rozszerzeniem *do ogromnej listy plików i katalogów.
bezartowy hałas
@artlessnoise jest na miejscu.
sjas

Odpowiedzi:

120

Aby usunąć wszystkie pliki i katalogi w bieżącym katalogu:

find . -mtime +3 | xargs rm -Rf

Lub alternatywnie, bardziej zgodnie z oryginalnym poleceniem PO:

find . -mtime +3 -exec rm -Rf -- {} \;
hd1
źródło
26
-1 Problem polega na tym, że gwiazda w „znajdź *”, rozwiązałeś go za pomocą polecenia „znajdź”. zamiast. Xargs wprowadza tutaj w błąd.
Aleksandr Levchuk
7
@AleksandrLevchuk rozwiązuje ops problem i dlatego nie zasługują na downvote
HD1
11
Pytanie: "find * -mtime +3 -exec rm {} \;" daje listę argumentów za długą. Odpowiedź: Użyj polecenia „find. -Mtime +3 -exec rm {} \;”
Aleksandr Levchuk
2
Możesz dodać --po rm, na przykładfind . -mtime +3 -exec rm -- {} \;
domen
8
Nikt nie powiedział, do czego --służy.
Acumenus,
59

Można również użyć:

find . -mindepth 1 -mtime +3 -delete

Nie usuwać katalogu docelowego

vangheem
źródło
4
Najlepsza odpowiedź, znacznie czystsza niż dzwonienie do rm (i prawdopodobnie bezpieczniejsza). Działa również dla podkatalogów.
podstawowy6
16

Inne rozwiązanie pierwotnego pytania, zwł. przydatne, jeśli chcesz usunąć tylko NIEKTÓRE ze starszych plików w folderze, byłoby coś takiego:

find . -name "*.sess" -mtime +100 

i tak dalej… Cudzysłowy blokują symbole wieloznaczne powłoki, dzięki czemu można „znaleźć” miliony plików :)

62mkv
źródło