Como mover arquivos para as pastas correspondentes com o mesmo nome?

2

Cenário de exemplo:

Eu tenho vários arquivos que terminam com .torrent e gostaria de movê-los para pastas com o mesmo nome.

Por exemplo, os seguintes arquivos:

abc.torrent
def.torrent
some files has spaces.torrent
or [special] (characters).torrent
or . (dots).torrent
xyz.torrent

Eu gostaria de movê-los para suas pastas correspondentes (se existirem) que tenham exatamente o mesmo nome, por exemplo:

  • abc.torrent entra em abc/
  • def.torrent entra em def/
  • e assim por diante

Se a pasta não existir, o arquivo deve permanecer intacto (pois pode estar relacionado ao download incompleto).

Eu acredito que o BitTorrent não tem essas opções. Se assim for, gostaria de encontrar alguma linha de comando para conseguir isso.

Opcionalmente, gostaria de especificar a pasta de origem dos meus arquivos e a pasta de destino com os diretórios esperados.

Alguma idéia?

    
por kenorb 22.12.2015 / 00:06

2 respostas

3
  • Não recursivamente:

    for t in *torrent; do [ -d "${t%.*}" ] && mv "$t" "${t%.*}"; done 
    

    A sintaxe ${var%pattern} remove a correspondência mais curta de pattern do final de uma variável. Neste caso, simplesmente remove a extensão.

  • Recursivamente (usando bash ):

    shopt -s globstar
    for t in **/*torrent; do [ -d "${t%.*}" ] && mv "$t" "${t%.*}"; done
    

    A opção globstar faz com que ** corresponda a quaisquer arquivos e 0 ou mais diretórios. Observe que o acima espera que o diretório de destino seja um subdiretório do diretório pai do arquivo torrent. Portanto, se um arquivo estiver em foo/bar/baz.torrent , ele será movido para foo/bar/baz/baz.torrent .

  • Não recursivamente, criando o diretório se ausente:

    for t in *torrent; do mkdir -p "${t%.*}"; mv "$t" "${t%.*}"; done 
    

    A opção -p informa mkdir para não imprimir nenhum erro se o diretório já existir e para criar diretórios pai conforme necessário. Portanto, mkdir -p foo/bar/baz também criará os diretórios foo e bar se eles não existirem.

  • Recursivamente, criando o diretório se ausente:

    shopt -s globstar
    for t in **/*torrent; do mkdir -p "${t%.*}"; mv "$t" "${t%.*}"; done
    
por 22.12.2015 / 00:42
3

Como não consegui encontrar essa opção na versão OS X do BitTorrent, escrevi o seguinte one-liner:

find . -name "*.torrent" -exec sh -c 'DST=$(find . -type d -name "$(basename "{}" .torrent)" -print -quit); [ -d "$DST" ] && mv -v "{}" "$DST/"' ';'

Isso procurará os arquivos .torrent no diretório atual ( . ) e localizará as pastas ( DST ) com o mesmo nome encontradas recursivamente na mesma pasta ( . ). Para verificar diretórios diferentes, altere os pontos ( . ) para destinos apropriados. Veja o script completo: mv_torrents.sh .

    
por 22.12.2015 / 00:06