Como excluir arquivos órfãos?

4

Eu gostaria de automatizar a limpeza de arquivos de legendas órfãos no meu NAS que está servindo arquivos para o KODI.

Quando eu excluo um episódio de TV assistido no KODI, ele deixa o arquivo de legenda correspondente intocado no diretório.

Gostaria de ter um script Bash para percorrer recursivamente a pasta de TV e excluir os arquivos de legenda ( .srt ou, às vezes, .xx.srt para outro idioma, onde xx é o código do idioma de duas letras ) que não tem um arquivo .mkv, .avi ou .mp4 correspondente.

Minha estrutura de pastas é assim:

-TV
  |-Show 1
  |  |-Season 01
  |  |-Season 02
  |      |-Show 1 S02E01.mkv
  |      |-Show 1 S02E01.srt
  |      |-Show 1 S02E02.avi
  |      |-Show 1 S02E02.srt
  |
  |-Show 2 
  |   |-Season 03
  |       |- Show 2 S03E02.mp4
          |- Show 2 S03E02.en.srt
          |- Show 2 S03E02.sv.srt

Depois de excluir episódios, parece algo assim:

-TV
  |-Show 1
  |  |-Season 01
  |  |-Season 02
  |      |-Show 1 S02E01.srt
  |      |-Show 1 S02E02.mp4
  |      |-Show 1 S02E02.srt
  |
  |-Show 2 
  |   |-Season 03
          |- Show 2 S03E02.en.srt
          |- Show 2 S03E02.sv.srt
    
por ICDeadPpl 12.12.2016 / 10:19

1 resposta

6

Você pode usar um loop for e alguns testes

for f in Show*/Season*/*.srt; do if [[ ! -f "${f%%.*}.mkv" ]] && [[ ! -f "${f%%.*}.mp4" ]] && [[ ! -f "${f%%.*}.avi" ]]; then echo rm -v -- "$f"; fi; done

Remova echo após o teste para excluir os arquivos

Como um script:

#!/bin/bash
for f in Show*/Season*/*.srt; do
    if [[ ! -f "${f%%.*}.mkv" ]] &&
       [[ ! -f "${f%%.*}.mp4" ]] &&
       [[ ! -f "${f%%.*}.avi" ]]; then
         echo rm -v -- "$f"
    fi
done

E remova echo para realmente fazer o trabalho, se você ver, ele removerá os arquivos corretos ...

if [[ ! -f "${f%%.*}.mkv" ]]; then significa que, se não houver tal arquivo como o arquivo com o qual estamos lidando, que possui uma extensão .mkv em vez de .srt , faça algo com o arquivo atual.

    
por Zanna 12.12.2016 / 11:06