Massa renomeando arquivos com formato especial

1

Eu quero renomear várias centenas de arquivos cujos nomes são formatados da seguinte forma:

A Study in Scarlet - Arthur Conan Doyle.mobi
Anvil of Stars - Greg Bear.mobi
City and the Stars, The - Arthur C. Clarke.mobi

Após renomear, quero alcançar este esquema de nomenclatura:

Arthur Conan Doyle - A Study in Scarlett.mobi
Greg Bear - Avil of Stars.mobi
Arthur C. Clarke - City and the Stars, The.mobi

Um bônus seria remover todos os caracteres irregulares do nome, como há:

  1. _ [sublinhados] para substituir por espaço em branco
  2. %20 para substituir por branco
  3. [] para substituir pelos arredondados ()
por Arvid Doerwald 11.05.2016 / 18:32

2 respostas

3

Eu escrevi um pequeno script para fazer o trabalho.

#!/bin/bash

# Variables
extension='mobi'
report='report.log'    

if [ -f $report ];
then
    rm -rf $report
fi

echo $'renaming files . . .\n'

for filename in *.$extension
do
    temp=$(echo $filename | tr '_' ' ' | tr '%20' ' ' | tr '[]' '()' | tr -s ' ' | sed 's/\.[^.]*$//' )

    part1=$(echo $temp | cut -f1 -d-)
    part2=$(echo $temp | cut -f2 -d-)
    new_filename=$(echo "${part2#?} - ${part1%?}.$extension")
    echo $(mv -v "$filename" "$new_filename") | tee -a $report
    if [ $? -ne 0 ]; then
        echo $'\n\nScript FAILED'
        exit 1
    fi
done

echo $'\n\nScript SUCCESSFUL'
exit 0

Crie um arquivo .bsh dentro do diretório em que seus arquivos .mobi estão armazenados e cole o código acima:

Abra um Terminal com Ctrl + Alt + T e navegue até o diretório em que seu script está armazenado:

cd /path/to/directory/

Para alterar as permissões do script:

chmod +x <filename>.bsh

Para executar o script:

bash <filename>.bsh

Se por algum motivo o mv falhar, você receberá um erro 'Script FAILED' , caso contrário, você obterá 'Script SUCCESSFUL' .

Explicação

tr '_' ' ' substitui sublinhados por espaço em branco

tr '%20' ' ' replace %20 com espaço em branco

tr '[]' '()' substitui colchetes por parênteses

tr -s ' ' substitui vários espaços por um

sed 's/\.[^.]*$//' extrai apenas o nome do arquivo sem a extensão

${string#?} remove o primeiro caractere de uma string

${string%?} remove o último caractere de uma string

mv -v isto mostrará no terminal quais arquivos estão sendo movidos. -v significa verbose.

tee -a changelog.log Por padrão, o comando tee lê a entrada padrão e grava na saída e nos arquivos padrão. -a significa acrescentar.

if [ $? -ne 0 ] verifica se o comando anterior foi bem sucedido.

report.log armazena o nome anterior e mais recente de cada arquivo.

Nota

O script assume que o nome do arquivo contém apenas um traço -

    
por efthialex 11.05.2016 / 19:33
0

Você pode usar find , xargs e prename para fazer isso. Leia as páginas man .

prename aplica uma "expressão regular" Perl aos nomes dos arquivos, e find e xargs são usados para lidar com nomes de arquivos contendo caracteres Espaço .

Eu posso oferecer:

find . -type f -iname '*.mobi' -print0 | \
    xargs -0 prename -v -n 's%^(.*/)(.*)( - )(.*)\.mobi%.mobi%'

E funcionou para mim:

  $ find . -maxdepth 1 -name '*.mobi' -print0 | xargs -0 prename -n -v 's%^(.*/)(.*)( - )(.*)\.mobi%.mobi%' 
./A Study in Scarlet - Arthur Conan Doyle.mobi renamed as ./Arthur Conan Doyle - A Study in Scarlet.mobi

Você pode usar execuções adicionais de prename para alterar seus outros personagens engraçados. Certifique-se de ler man perlre para aprender sobre expressões regulares Perl. Se você não usou expressões regulares antes, uma introdução de início rápido estará disponível em man perlrequick e uma introdução mais longa do tutorial estará disponível em man perlretut .

    
por waltinator 11.05.2016 / 19:04