Excluir arquivos com mais de X dias

143

Encontrei o comando para excluir arquivos com mais de 5 dias em uma pasta

find /path/to/files* -mtime +5 -exec rm {} \;

Mas como também faço isso para subdiretórios nessa pasta?

Teddy291
fonte
Você quer dizer arquivos dentro dos subdiretórios? ou os próprios subdiretórios?
rahul
3
find /path/to -type d -empty -delete
7305 Costas
2
Excluir arquivos em subdiretórios que são também 5+ dias de idade
Teddy291
3
Possivelmente divertido quando tenho arquivos com espaços. Por exemplo, um arquivo chamado "test one" e rm são alimentados rm test one. (Que excluirá um arquivo chamado "teste" e um arquivo chamado "um", mas não um arquivo chamado "teste um"). Dica: -delete or -print0
Hennes
6
Como nota lateral, sempre cite o argumento fornecido porfind para evitar problemas com caracteres especiais, conforme mencionado na primeira linha da resposta. Por exemplo:find /path/to/files/ -exec somecommand '{}' \;
Walf

Respostas:

240

Cuidado com nomes de arquivos especiais (espaços, aspas) ao canalizar para rm.

Existe uma alternativa segura - a opção -delete :

find /path/to/directory/ -mindepth 1 -mtime +5 -delete

É isso, nenhuma chamada rm separada e você não precisa se preocupar com nomes de arquivos.

Substitua -deletepor -depth -printpara testar este comando antes de executá-lo ( -deleteimplica -depth).

basic6
fonte
23
Também use -type fpara excluir apenas os arquivos (e manter sub-diretórios)
Oleg
3
Alternativamente, se você quiser fazer o mesmo para todos os arquivos mais recentes de cinco dias: find / path / to / directory / -mindepth 1 -mtime -5 -delete
zmonteca
Se meu caminho contiver espaços, como devo fazê-lo? find /path/to/dir\ with\ spaces/ -mindepth 1 -mtime +5 -delete?
Patrick Gregorio
3
@ uom-pgregorio Eu sugiro colocar o caminho entre aspas.
Atripes #
4
Observe que todo findargumento é um filtro que usa o resultado do filtro anterior como entrada. Portanto, certifique-se de adicionar -delete como o último argumento. IE: find . -delete -mtime +5excluirá TUDO no caminho atual.
Johan
15

Observe que este comando não funcionará quando encontrar muitos arquivos. Irá gerar um erro como:

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

Significando que o limite da chamada do sistema exec no comprimento de uma linha de comando foi excedido. Em vez de executar rm dessa maneira, é muito mais eficiente usar o xargs . Aqui está um exemplo que funciona:

find /root/Maildir/ -mindepth 1 -type f -mtime +14 | xargs rm

Isso removerá todos os arquivos (tipo f) modificados há mais de 14 dias em / root / Maildir / recursivamente a partir daí e em profundidade (mindepth 1). Veja o manual de localização para mais opções .

Julius
fonte
7
De acordo com a resposta de @ AfshinHamedi no AskUbuntu ( askubuntu.com/questions/589210/removing-files-older-than-7-day ), tenha cuidado com arquivos contendo novas linhas e caracteres especiais. Em vez disso usefind /root/Maildir/ -mindepth 1 -type f -mtime +14 -print0 | xargs -r0 rm --
Cbhihe
2
Ou basta adicionar '+' para os resultados da procura
Dani_l
8

É o mesmo. Você apenas precisa fornecer o diretório pai em vez do prefixo dos arquivos. No seu exemplo, seria:

find /path/to -type f -mtime +5 -exec rm {} \;

Isso excluirá todos os arquivos anteriores a 5 dias /path/toe seus subdiretórios.

Para excluir subdiretórios vazios, consulte o comentário do @Costas acima.

apaul
fonte
4
Observe que para cada arquivo você executará o comando rm. Se você tiver 1000 arquivos com mais de 5 dias, o rm será iniciado 1000 vezes. Por esta razão, considerar a opção -delete como no comentário de Costa ou rm -exec {} \ +
Hennes
@Hennes: - 1) não tenho certeza se você precisa escapar +nesse caso. - 2) melhor escrever -exec rm '{}' +para afastar o mal dos arquivos com caracteres especiais (espaços, novas linhas, etc ...) em seu nome.
Cbhihe
-1
find . -mtime +3 -type f -not -name '*pid*' |xargs rm -rf
Susil
fonte