Como deletar todos os arquivos com mais de 3 dias quando a “Lista de argumentos é muito longa”?

89

Eu tenho um diretório de arquivo de log que contém 82.000 arquivos e diretórios (cerca de meio a meio).

Preciso excluir todos os arquivos e diretórios com mais de 3 dias.

Em um diretório com 37.000 arquivos, consegui fazer isso com:

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

Mas com 82.000 arquivos / diretórios, recebo o erro:

/ usr / bin / find: Lista de argumentos muito longa

Como posso contornar esse erro para excluir todos os arquivos / diretórios com mais de 3 dias?

Edward Tanguay
fonte
1
Você já tentou find -mtime +3 -exec rm {} +?
Gilles Quenot
1
Acredito que correr find * -mtime +3 |xargs rmresolveria esse problema.
Mats Petersson
9
Acho que o único problema é find *. find .é melhor. O shell globing expande o *para uma lista enorme de arquivos e diretórios.
ruído natural de
@artlessnoise está certo.
sjas

Respostas:

120

Para excluir todos os arquivos e diretórios do diretório atual :

find . -mtime +3 | xargs rm -Rf

Ou, alternativamente, mais em linha com o comando original do OP:

find . -mtime +3 -exec rm -Rf -- {} \;
hd1
fonte
26
-1 O problema é a estrela em "find *", você resolveu usando "find". em vez de. Xargs é enganoso aqui.
Aleksandr Levchuk
7
@AleksandrLevchuk resolve o problema de OPs e, portanto, não merece um downvote
hd1
11
Pergunta: "find * -mtime +3 -exec rm {} \;" dá a lista de argumentos muito longa. Resposta: Use "find. -Mtime +3 -exec rm {} \;"
Aleksandr Levchuk
2
Você pode adicionar --depois de rm, comofind . -mtime +3 -exec rm -- {} \;
domen
8
Ninguém disse para que --serve.
Acumenus
59

Também pode usar:

find . -mindepth 1 -mtime +3 -delete

Para não excluir o diretório de destino

vangheem
fonte
4
Melhor resposta, muito mais limpa do que chamar rm (e provavelmente mais segura). Funciona para subdiretórios também.
básico 6
16

Outra solução para a questão original, esp. útil se você deseja remover apenas ALGUNS dos arquivos mais antigos em uma pasta, seria algo assim:

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

e assim por diante .. Cita curingas de shell de bloco, permitindo que você "encontre" milhões de arquivos :)

62mkv
fonte