Script de limpeza baseado em idade e uma lista de diretórios TXT

0

Isto é para o meu servidor de mídia:

Eu tenho uma pasta contendo todos os meus programas de TV e, para alguns programas, continuo indefinidamente, enquanto outros gostaria de limpar os arquivos de mídia quando eles atingem 90 dias de idade.

Portanto, gostaria de preencher uma lista dos programas, pelo caminho deles, que eu quero remover depois de 90 dias em um arquivo TXT e um script agendado que será executado diariamente por essa lista.

Dessa forma, posso adicionar ou remover programas da lista TXT e, em seguida, saber que há algo nessa lista que tenho 90 dias para assistir antes que os episódios do programa sejam excluídos.

Claro, eu gostaria de limpar os arquivos de vídeo e não outros, como as pastas de temporada, obras de arte, etc. Então, a lista típica de extensões - mkv, mp4, mpg, mpeg, avi, xvid, ts, mas não a estrutura de pastas.

Encontrei muitos manuais para limpar arquivos com mais de X dias, mas não algo específico.

Quando eu tinha meus arquivos de mídia em um PC Windows, eu corri um programa simples chamado autodelete onde você especificou as pastas e os dias e as extensões e ele cuidou das coisas, mas desde a mudança para o Ubuntu, eu não tenho encontrou o mesmo.

Qualquer ajuda apreciada.

    
por DGC 05.02.2018 / 15:48

2 respostas

2

Não há necessidade de nenhum programa adicional ou mesmo de um script, find pode fazer isso com uma única chamada.

Eu suponho que você tenha uma árvore de diretórios como esta:

.
├── delete
├── GoT
│   ├── artwork.png
│   ├── S10E05_Everybody_dies.mkv
│   └── stream.ts
├── TBBT
│   └── Season_01
│       ├── file.avi
│       └── notes
└── The_Wire
    ├── current.mp4
    └── wallpaper.jpg

O conteúdo do arquivo delete se parece com isto:

/full/path/to/GoT
/full/path/to/TBBT

Este comando find procurará em todos os diretórios por arquivos com as extensões especificadas e uma idade de mais de 89 dias:

find $(</path/to/delete) -type f \( -name "*.mkv" -o -name "*.mp4" -o -name "*.mpg" -o -name "*.mpeg" -o -name "*.avi" -o -name "*.xvid" -o -name "*.ts" \) -mtime +89

A saída do meu exemplo é:

/full/path/to/GoT/stream.ts
/full/path/to/GoT/S10E05_Everybody_dies.mkv
/full/path/to/TBBT/Season_01/file.avi

Use isso para testar o comando. Se fizer o que você deseja, basta adicionar -delete ao final do comando para executar a exclusão:

find $(</path/to/delete) -type f \( -name "*.mkv" -o -name "*.mp4" -o -name "*.mpg" -o -name "*.mpeg" -o -name "*.avi" -o -name "*.xvid" -o -name "*.ts" \) -mtime +89 -delete

Você pode executar este último comando periodicamente, por exemplo, usando um cronjob (mas defina SHELL=/bin/bash no crontab primeiro, cron usa dash por padrão!) - a palavra-chave @daily poderia ser útil:

@daily find $(</path/to/delete) …

Uma observação sobre espaços em caminhos: eu realmente recomendo livrar-se de espaços em nomes de diretórios e arquivos em geral, mas se você realmente precisa ter espaços nos caminhos, você pode querer definir IFS=$'\n' primeiro para permitir somente caractere de nova linha como um delimitador de argumentos.

    
por dessert 06.02.2018 / 08:38
0

Ok, aqui está o meu feedback.

Sim, o script funciona, mas com um grande aviso.

Se o arquivo "delete" não for encontrado, ele será executado com sucesso, mas contra todos os arquivos, e será aplicado onde quer que você esteja na linha de comando.

  • Existe uma maneira de verificar a existência do arquivo?

Eu tentei colocar aspas no arquivo de exclusão, para lidar com o espaçamento, mas isso não levou muito bem. Então eu realizei sua sugestão.

Aqui está o comando exato, como executado:

IFS=$'\n' && find $(</opt/deletelist) -type f \( -name "*.mkv" -o -name "*.mp4" -o -name "*.mpg" -o -name "*.mpeg" -o -name "*.avi" -o -name "*.xvid" -o -name "*.ts" \) -mtime +89

Consegui os resultados que esperava, por isso parece funcionar.

    
por DGC 06.02.2018 / 20:16