Script Bash para excluir arquivos com mais de x dias com subdiretórios

37

Estou tentando excluir uma tonelada de arquivos com mais de x dias.

Agora eu tenho um script para fazer isso

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

Mas isso também excluirá os subdiretórios. Há muitas pastas, mas gostaria de mantê-las e excluir os arquivos com mais de 10 dias nas pastas.

Existe uma maneira de fazer isso?

JoyIan Yee-Hernandez
fonte

Respostas:

50

type opção para filtrar resultados

findaceita a typeopção de selecionar, por exemplo, apenas arquivos.

find /path/to/files -type f -mtime +10 -delete

Deixe de fora -deletepara mostrar o que seria excluído e, depois de verificar isso, vá em frente e execute o comando completo.

Isso seria executado apenas em arquivos, não em diretórios. Use -type dpara o inverso, listando apenas os diretórios que correspondem aos seus argumentos.


Opções adicionais

Você pode querer ler man find, pois há mais algumas opções que você poderá precisar no futuro. Por exemplo, -maxdepthpermitiria restringir apenas os itens encontrados a uma profundidade específica, por exemplo -maxdepth 0, não recursaria em subdiretórios.

Algumas observações

  • Gostaria de saber como o comando teria removido uma pasta, já que você não pode remover uma pasta rmapenas. Você precisaria rm -rdisso.

  • Além disso, /path/to/files*é confuso. Você quis dizer /path/to/files/ou espera que o curinga se expanda para vários nomes de arquivos e pastas?

  • Coloque as {}aspas simples, ou seja, '{}'para evitar que o nome do arquivo / diretório substituído seja interpretado pelo shell, assim como protegemos o ponto e vírgula com uma barra invertida.

slhck
fonte
Bem, existem muitas pastas em / path / to / files /, na verdade, eu gostaria de executar o mtime +10 -exec rm em cada uma dessas pastas, mas manter as próprias pastas, basicamente, eu gostaria de conseguir é excluir todas as arquivos com mais de 10 dias e mantenha todas as pastas. Eu sou um ataque desculpe newb que newbness :)
JoyIan Yee-Hernandez
Bem, lá vai você :) Basta fazer um find /path/to/files* -type f -mtime +10e ver o que seria produzido.
slhck
Sim, quando estiver em dúvida, não faça -exec, apenas veja o que encontrar primeiro.
Rob
2
@ JoyIanYee-Hernandez Você também pode usar o -deleteargumento para find, que exclui todos os arquivos e pastas, este último apenas se vazio. Implica -depth, ou seja, busca em profundidade.
Daniel Beck
11
@Kreker Então você precisa adicionar -mindepth 1para excluir o diretório pai.
slhck
5

Como nas respostas anteriores (+1 para ambos), o truque é usar o -type fpredicado.

Observe que em vez de -exec rm '{}'você também pode usar o -deletepredicado. Mas não faça isso. Com -exec rm '{}'você, você pode (e deve) fazer primeiro -exec echo rm '{}'para verificar se é isso que realmente deseja. Depois disso, execute novamente o comando sem o echo.

O uso -deleteé mais rápido (sem acréscimo fork()e execve()para cada arquivo), mas isso é arriscado porque -deletefunciona também como uma condição, portanto:

# delete *.tmp files
find . -type f -name '*.tmp' -delete

mas se você apenas trocar argumentos:

# delete ALL files
find . -type f -name '*.tmp' -delete

Se você precisar finde rmtrabalhar mais rápido para toneladas de arquivos, consulte o find ... | xargs ... rmidioma do UNIX.

Michał Šrajer
fonte
4
Eu acho que seus dois últimos exemplos são exatamente os mesmos, talvez você queira corrigir isso!
slhck 23/05
1

Você pode fazer isso facilmente com o comando find

$ find -type f

O que restringe os resultados ao tipo de arquivo

Bernhard
fonte
1

Eu estava lutando para acertar isso usando os scripts fornecidos acima e alguns outros scripts, especialmente quando os nomes de arquivos e pastas tinham nova linha ou espaços.

Finalmente tropeçamos no tmpreaper e tem funcionado muito bem para nós até agora.

tmpreaper -t 5d ~/Downloads


tmpreaper  --protect '*.c' -t 5h ~/my_prg

Link da fonte original

Possui recursos como teste, que verifica os diretórios recursivamente e os lista. Capacidade de excluir links simbólicos, arquivos ou diretórios e também o modo de proteção para um determinado padrão ao excluir

user52573
fonte
0

Para acelerar o comando, use em '+'vez de\;

find /path/to/files* -type f -mtime +10 -exec rm '{}' '+'

Isso será executado rmapenas uma vez no final, em vez de cada vez que um arquivo for encontrado.
( rmpode ser executado várias vezes se você tiver realmente muitos arquivos devido à limitação do comprimento da linha de comando, mas isso ainda é quase tão rápido quanto o uso -delete)

olibre
fonte
0

rm -f find /path/to/files -type file -mtime -5

Isso excluirá os arquivos modificados dentro de 5 dias

rm -f find /path/to/files -type file -mtime +5

Isso excluirá os arquivos modificados antes de 5 dias

Use `antes de localizar e no final após 5.

Nikhil Shinde
fonte