Como encontrar e excluir arquivos mais antigos que dias específicos no unix?
38
Eu tenho uma pasta para o log com 7 pastas nele. Essas sete pastas também têm subpastas e essas subpastas também. Desejo excluir todos os arquivos com mais de 15 dias em todas as pastas, incluindo subpastas sem tocar na estrutura da pasta, o que significa apenas arquivos.
mahesh@inl00720:/var/dtpdev/tmp/ > ls
A1 A2 A3 A4 A5 A6 A7
mahesh@inl00720:/var/dtpdev/tmp/A1/ > ls
B1 B2 B3 B4 file1.txt file2.csv
Você poderia começar dizendo find /var/dtpdev/tmp/ -type f -mtime +15. Ele encontrará todos os arquivos com mais de 15 dias e imprimirá seus nomes. Opcionalmente, você pode especificar -printno final do comando, mas essa é a ação padrão. É recomendável executar o comando acima primeiro, para ver quais arquivos estão selecionados.
Depois de verificar se o findcomando está listando os arquivos que você deseja excluir (e nenhum outro), você pode adicionar uma "ação" para excluir os arquivos. As ações típicas para fazer isso são:
-exec rm -f {} \;(ou, equivalente -exec rm -f {} ';')
Isso será executado rm -fem cada arquivo; por exemplo,
portanto, pode ser um pouco mais rápido que a opção 1. (Pode ser necessário executar rm -falgumas vezes se você tiver milhares de arquivos.)
-delete
Isso diz findpara excluir os arquivos, sem executar rm. Isso pode ser infinitesimalmente mais rápido que as -execvariantes, mas não funcionará em todos os sistemas.
Portanto, se você usar a opção 2, todo o comando seria:
O uso de -delete é mais simples (sintaxe e nenhum processo filho foi gerado para excluir), mas pode não funcionar em todos os sistemas. rm -f {} + é o melhor, ele excluirá os arquivos em lotes se houver arquivos suficientes para ser demais para uma linha de comando. rm -f {} ';' dará erro de comando muito longo se houver arquivos suficientes para ser demais para uma linha de comando.
gaoithe
-1
Ou faça-o com um loop:
for x in $(find /var/dtpdev/tmp/ -type f -mtime +15); do rm "$x"; done
Isso não funcionará com arquivos com espaços neles.
Drav Sloan
Você pode usar um loop while, que deve cuidar de arquivos com espaços. encontre / var / dtpdev / tmp / -type f -mtime +15 | enquanto lê x; faça rm "$ x"; feito
Ou faça-o com um loop:
fonte