Remover números de nomes de arquivos

4

Eu tenho um problema ao modificar os nomes dos arquivos no meu diretório Music/ .

Eu tenho uma lista de nomes como estes:

$ ls
01 American Idiot.mp3
01 Articolo 31 - Domani Smetto.mp3
01 Bohemian rapsody.mp3
01 Eye of the Tiger.mp3
04 Halo.mp3
04 Indietro.mp3
04 You Can't Hurry Love.mp3
05 Beautiful girls.mp3
16 Apologize.mp3
16 Christmas Is All Around.mp3
Adam's song.mp3
A far l'amore comincia tu.mp3
All By My Self.MP3
Always.mp3
Angel.mp3

E semelhante e eu gostaria de cortar todos os números na frente dos nomes de arquivos (não os 3 na extensão).

Eu tentei primeiro grep apenas os arquivos com o número com find -exec ou xargs , mas mesmo nesse primeiro passo eu não tive sucesso. Depois de poder usar grep , gostaria de fazer a alteração real do nome.

Isso é o que eu tentei agora:

ls > try-expression
grep -E '^[0-9]+' try-expression

e com o acima eu consegui o resultado certo. Então eu tentei o próximo passo:

ls | xargs -0 grep -E '^[0-9]+'
ls | xargs -d '\n' grep -E '^[0-9]+'
find . -name '[0-9]+' -exec grep -E '^[0-9]+' {} \;
ls | parallel bash -c "grep -E '^[0-9]+'" - {}

E semelhante, mas recebi um erro como 'Nome do arquivo longo demais' ou nenhuma saída. Eu acho que o problema é a maneira que eu estou usando xargs ou find como expressões em comandos separados funcionam bem.

Obrigado pela sua ajuda

    
por Luigi Tiburzi 29.05.2012 / 10:07

5 respostas

5

Para listar todos os arquivos, comece com o número em um diretório,

find . -maxdepth 1 -regextype "posix-egrep" -regex '.*/[0-9]+.*\.mp3' -type f

O problema com sua abordagem é que find retorna um caminho relativo de um arquivo e você está esperando apenas um nome de arquivo.

    
por 29.05.2012 / 11:09
4

No Debian, Ubuntu e derivados, use o script rename perl.

Para simular a operação de renomeação:

    rename 's/^\d+ //' * -n

Remova o -n (sem ação) para executar a operação:

    rename 's/^\d+ //' *

Com um pouco de sorte, o renomear perl também é instalado como /usr/bin/rename em sua distribuição (há rumores de que o Fedora também usa renomeação perl).

Veja a página de renomeação do perl para mais detalhes sobre outros recursos.

    
por 29.05.2012 / 11:26
3

Aqui está algo que você pode fazer usando apenas bash , com um regex em um condicional :

#! /bin/bash

# get all files that start with a number
for file in [0-9]* ; do
    # only process start start with a number
    # followed by one or more space characters
    if [[ $file =~ ^[0-9]+[[:blank:]]+(.+) ]] ; then
        # display original file name
        echo "< $file"
        # grab the rest of the filename from
        # the regex capture group
        newname="${BASH_REMATCH[1]}"
        echo "> $newname"
        # uncomment to move
        # mv "$file" "$newname"
    fi
done

Quando executado nos nomes dos arquivos de amostra, a saída é:

< 01 American Idiot.mp3
> American Idiot.mp3
< 01 Articolo 31 - Domani Smetto.mp3
> Articolo 31 - Domani Smetto.mp3
< 01 Bohemian rapsody.mp3
> Bohemian rapsody.mp3
< 01 Eye of the Tiger.mp3
> Eye of the Tiger.mp3
< 04 Halo.mp3
> Halo.mp3
< 04 Indietro.mp3
> Indietro.mp3
< 04 You Can't Hurry Love.mp3
> You Can't Hurry Love.mp3
< 05 Beautiful girls.mp3
> Beautiful girls.mp3
< 16 Apologize.mp3
> Apologize.mp3
< 16 Christmas Is All Around.mp3
> Christmas Is All Around.mp3
    
por 29.05.2012 / 11:10
2

É relativamente fácil em zsh com zmv :

zmv '[0-9]## #(*.mp3)' '$1'

Explicação: [0-9]## # é um padrão que corresponde a um ou mais dígitos seguido por zero ou mais espaços. O comando acima renomeia todos os arquivos que começam com esse padrão e terminam com .mp3 para a parte capturada pelos parênteses.

    
por 30.05.2012 / 03:27
0

Acabei de escrever algumas linhas no objeto Rexx que remove os números do início dos arquivos. Meus arquivos eram como:

Dados:

003. Atomic Rooster.mp3
087. Crowded House.mp3

Código:

#!/bin/rexx
'rxqueue /clear'
'ls | rxqueue'
do while queued()>0
 parse pull fn
 parse var fn .'.'rest
 rest = strip(rest)
 if pos('.',rest)=0 then iterate
 "mv '"fn"' '"rest"'"
end
    
por 15.06.2017 / 21:58