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
gtaware
fonte

Respostas:

54

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:

  1. -exec rm -f {} \;(ou, equivalente -exec rm -f {} ';')
    Isso será executado rm -fem cada arquivo; por exemplo,

    rm -f /var/dtpdev/tmp/A1/B1; rm -f /var/dtpdev/tmp/A1/B2; rm -f /var/dtpdev/tmp/A1/B3; …
    
  2. -exec rm -f {} +
    Isso será executado rm -fem muitos arquivos ao mesmo tempo; por exemplo,

    rm -f /var/dtpdev/tmp/A1/B1 /var/dtpdev/tmp/A1/B2 /var/dtpdev/tmp/A1/B3 …
    

    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.)

  3. -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:

find /var/dtpdev/tmp/ -type f -mtime +15 -exec rm -f {} +
Jan
fonte
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
foobar
fonte
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
David Okwii