AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / ubuntu / Perguntas / 1530025
Accepted
user6790086
user6790086
Asked: 2024-10-15 12:40:01 +0800 CST2024-10-15 12:40:01 +0800 CST 2024-10-15 12:40:01 +0800 CST

Mover recursivamente arquivos de legenda para subdiretórios

  • 772

Atualmente, executo o Plex em um Beelink executando o Ubuntu e, até o momento, todos os arquivos associados a cada filme (arquivo de filme, imagens associadas e legendas) estão todos no mesmo diretório pai. Na maioria das vezes, isso é bom, mas para filmes com várias legendas, pode ficar confuso. Por exemplo:

    /Movies
       /Avatar (2009)
          Avatar (2009).mkv
          Avatar (2009).eng.srt
          Avatar (2009).en.forced.ass
          Avatar (2009).en.sdh.srt
          Avatar (2009).de.srt
          Avatar (2009).de.sdh.forced.srt

Parece que agora o plex encontrará lugares de legendas em uma pasta "subs" ou "subtitles". Então, para arrumar as coisas, como posso percorrer recursivamente o diretório do filme pai e, para cada pasta de filme individual, mover quaisquer arquivos de legendas para uma pasta "subtitles" assim?

/Movies
   /Avatar (2009)
      Avatar (2009).mkv
      /Subtitles
         Avatar (2009).eng.srt
         Avatar (2009).en.sdh.srt
         Avatar (2009).de.srt
         Avatar (2009).de.sdh.forced.srt

Para programas de TV, pode haver vários níveis na pasta pai, por exemplo

**Old:**


/TV Shows
   /Game Of Thrones
      /Season 02
         Game Of Thrones - s02e03.mp4
         Game Of Thrones - s02e03.eng.srt
         Game Of Thrones - s02e03.en.forced.srt


**New:**
         
TV Shows
   /Game Of Thrones
      /Season 01
         Game Of Thrones - s01e03.mp4
         Game Of Thrones - s01e04.mp4
         /Subtitles
           Game Of Thrones - s01e03.eng.srt
           Game Of Thrones - s01e04.eng.srt
      /Season 02
         Game Of Thrones - s02e03.mp4
         /Subs
           Game Of Thrones - s02e03.eng.srt
           Game Of Thrones - s02e03.en.forced.srt

Melhor ainda seria a opção de mover somente se ainda não estiver em uma pasta de legendas ...

command-line
  • 2 2 respostas
  • 367 Views

2 respostas

  • Voted
  1. Best Answer
    kos
    2024-10-15T14:11:48+08:002024-10-15T14:11:48+08:00
    find . -name 'Subtitles' -prune -o -type f -name '*.srt' -printf '%h\0' | sort -zu | while IFS= read -d '' -r d; do
        printf "Creating '%s'...\n" "${d}/Subtitles"
        printf "Moving '%s' to '%s'...\n" "${d}/*.srt" "${d}/Subtitles"
    done
    

    Encontrará o caminho de cada .srtarquivo no diretório de trabalho atual, recursivamente, excluindo aqueles contidos em um diretório chamado "Legendas", imprimindo apenas seu nome base e filtrando duplicatas, criando um diretório "Legendas" dentro de cada caminho resultante (se não existir) e movendo cada .srtarquivo em seu nível para dentro dele.

    Ele lidará com .srtarquivos localizados em qualquer profundidade do diretório de trabalho atual e também com o diretório "Programas de TV".

    O comando executará um teste; se a saída parecer boa, execute o comando real:

    find . -name 'Subtitles' -prune -o -type f -name '*.srt' -printf '%h\0' | sort -zu | while IFS= read -d '' -r d; do
        mkdir -p "${d}/Subtitles"
        mv "${d}"/*.srt "${d}/Subtitles"
    done
    

    % tree -a
    .
    ├── foo
    │   └── bar
    │       ├── baz
    │       │   └── Subtitles
    │       │       └── sub_baz.srt
    │       └── sub_bar.srt
    └── sub.srt
    
    5 directories, 3 files
    % find . -name 'Subtitles' -prune -o -type f -name '*.srt' -printf '%h\0' | sort -zu | while IFS= read -d '' -r d; do
        mkdir -p "${d}/Subtitles"
        mv "${d}"/*.srt "${d}/Subtitles"
    done
    % tree -a
    .
    ├── foo
    │   └── bar
    │       ├── baz
    │       │   └── Subtitles
    │       │       └── sub_baz.srt
    │       └── Subtitles
    │           └── sub_bar.srt
    └── Subtitles
        └── sub.srt
    
    7 directories, 3 files
    
    • 5
  2. terdon
    2024-10-15T23:37:59+08:002024-10-15T23:37:59+08:00

    Aqui está outra abordagem. Use globstara opção do bash para permitir a recursão em subdiretórios. De man bash:

    estrela mundial

    Se definido, o padrão **usado em um contexto de expansão de nome de caminho corresponderá a todos os arquivos e zero ou mais diretórios e subdiretórios. Se o padrão for seguido por um /, apenas diretórios e subdiretórios corresponderão.

    Então, **/só corresponderá a diretórios, mas incluirá subdiretórios. Com isso em mente, você pode fazer:

    shopt -s globstar
    for d in **/; do mkdir -p "$d/Subtitles" && mv "$d/"*.srt "$d"/Subtitles ; done
    rmdir **/Subtitles/
    

    Testei usando este conjunto de arquivos e diretórios:

    $ tree
    .
    ├── a
    ├── b
    ├── Movies
    │   └── Avatar
    │       ├── Avatar (2009).de.sdh.forced.srt
    │       ├── Avatar (2009).de.srt
    │       ├── Avatar (2009).en.forced.ass
    │       ├── Avatar (2009).eng.srt
    │       ├── Avatar (2009).en.sdh.srt
    │       └── Avatar (2009).mkv
    └── TV Shows
        └── Game Of Thrones
            └── Season 02
                ├── Game Of Thrones - s02e03.emg.srt
                ├── Game Of Thrones - s02e03.en.forced.srt
                └── Game Of Thrones - s02e03.mp4
    
    6 directories, 11 files
    

    Depois de executar o comando acima, obtive:

    $ tree
    .
    ├── a
    ├── b
    ├── Movies
    │   └── Avatar
    │       ├── Avatar (2009).en.forced.ass
    │       ├── Avatar (2009).mkv
    │       └── Subtitles
    │           ├── Avatar (2009).de.sdh.forced.srt
    │           ├── Avatar (2009).de.srt
    │           ├── Avatar (2009).eng.srt
    │           └── Avatar (2009).en.sdh.srt
    └── TV Shows
        └── Game Of Thrones
            └── Season 02
                ├── Game Of Thrones - s02e03.mp4
                └── Subtitles
                    ├── Game Of Thrones - s02e03.emg.srt
                    └── Game Of Thrones - s02e03.en.forced.srt
    
    8 directories, 11 files
    

    Note que ele lançará alguns avisos para casos em que não há arquivos srt em um diretório, pois ele tentará executar mv directory_name/*srt directory_name/Subtitles, mas como o *.srtglob não corresponde a nada, ele retornará a si mesmo (a menos que você tenha a nullglobopção ativada) e, como não há nenhum arquivo cujo nome seja literalmente *srt, ele falhará. É também por isso que tive que adicionar rmdir **/Subtitlespara remover Subtitlesdiretórios vazios. Você pode adicionar com segurança 2> /dev/nullao final do mvcomando para ocultar esses avisos.

    Como alternativa, você pode fazer algo um pouco mais complexo e criar o diretório somente e tentar copiá-lo quando tiver certeza de que possui *.srtos arquivos:

    shopt -s globstar
    shopt -s nullglob
    for d in **/; do 
      subs=( "$d"/*.srt ) 
      [[ ${#subs[@]} -gt 0 ]] && 
        mkdir -p "$d"/Subtitles && 
          mv "$d"/*srt "$d"/Subtitles
    done
    

    O que resulta na saída desejada em uma única passagem. Para evitar mover arquivos se eles já estiverem em um Subtitlesdiretório, use a extglobopção bash que permite que você crie globs mais complexos, e apenas procure por qualquer diretório cujo nome não seja Subtitles:

    shopt -s globstar nullglob extglob
    for d in **/!(Subtitles)/; do 
      subs=( "$d"/*.srt ) 
      [[ ${#subs[@]} -gt 0 ]] && 
        mkdir -p "$d"/Subtitles && 
          mv "$d"/*srt "$d"/Subtitles
    done
    
    • 4

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Existe um comando para listar todos os usuários? Também para adicionar, excluir, modificar usuários, no terminal?

    • 9 respostas
  • Marko Smith

    Como excluir um diretório não vazio no Terminal?

    • 4 respostas
  • Marko Smith

    Como descompactar um arquivo zip do Terminal?

    • 9 respostas
  • Marko Smith

    Como instalo um arquivo .deb por meio da linha de comando?

    • 11 respostas
  • Marko Smith

    Como instalo um arquivo .tar.gz (ou .tar.bz2)?

    • 14 respostas
  • Marko Smith

    Como listar todos os pacotes instalados

    • 24 respostas
  • Martin Hope
    Flimm Como posso usar o docker sem sudo? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    led-Zepp Como faço para salvar a saída do terminal em um arquivo? 2014-02-15 11:49:07 +0800 CST
  • Martin Hope
    ubuntu-nerd Como descompactar um arquivo zip do Terminal? 2011-12-11 20:37:54 +0800 CST
  • Martin Hope
    TheXed Como instalo um arquivo .deb por meio da linha de comando? 2011-05-07 09:40:28 +0800 CST
  • Martin Hope
    Ivan Como listar todos os pacotes instalados 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    David Barry Como determino o tamanho total de um diretório (pasta) na linha de comando? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher "Os seguintes pacotes foram retidos:" Por que e como resolvo isso? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford Como os PPAs podem ser removidos? 2010-07-30 01:09:42 +0800 CST

Hot tag

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve