Renomeando mil arquivos com nomes semelhantes

1

Estou com dificuldades para criar um script bash para renomear meus arquivos, por isso estou pedindo ajuda. Os arquivos estão na mesma pasta e todos parecem com isso

1xxx_ (grupo de caracteres) = (grupo de caracteres) = 1234567890

Agora, o que eu quero é deixar apenas o último 1234567890. Basicamente, excluindo todos os caracteres da frente para a segunda ocorrência de =

Qualquer ajuda será muito apreciada:)

    
por OneStyle07 29.12.2015 / 23:05

3 respostas

2

Você pode usar o recurso de expansão de parâmetros do shell: em particular

${parameter#word}
${parameter##word}
       Remove matching prefix pattern.  The word is expanded to produce
       a pattern just as in pathname expansion.  If the pattern matches
       the  beginning of the value of parameter, then the result of the
       expansion is the expanded value of parameter with  the  shortest
       matching  pattern  (the ''#'' case) or the longest matching pat‐
       tern (the ''##'' case) deleted.

Então, algo como

for file in *; do echo mv -- "$file" "${file##*=}"; done

(remova o echo se parecer que faz a coisa certa).

Um problema que você pode enfrentar é que os nomes de arquivos podem se tornar não exclusivos depois que os prefixos forem removidos. Você pode optar por ignorar a renomeação desses casos usando a opção -n ou --no-clobber para mv :

for file in *; do mv --no-clobber -- "$file" "${file##*=}"; done

ou use a opção -b ou --backup para criar backups distintos: mais diretamente

for file in *; do mv --backup=numbered -- "$file" "${file##*=}"; done

que adicionará sufixos de distinção .~1~ , .~2~ e assim por diante.

    
por 29.12.2015 / 23:31
2

O script de renomeação perl (vem padrão no debian / ubuntu, ou disponível aqui: link ) renomeie arquivos com base em uma expressão regular. com -n ele apenas imprimirá os arquivos nomeados sem realmente renomeá-los, permitindo que você teste antes de executar a ação:

# Check before renaming...
$ rename -n 's/^.*=//' *
1xxx_DSAFDSAFDSFA=FDAFDSAFDSAFSDA=12341243142 renamed as 12341243142

# now rename all files
$ rename 's/^.*=//' *

É uma ferramenta muito flexível, pois pode operar facilmente em arquivos baseados em curingas (por exemplo, * para todos os arquivos ou *.txt para todos os arquivos de texto) e aceita qualquer expressão regular perl.

    
por 30.12.2015 / 21:06
0

awk pode salvar o dia aqui também. Estou usando cp lá, mude para mv se você quiser:

ls | awk -F"=" '{system("cp -i "$0" "$3)}'

Eu também usaria o parâmetro -i como cp , só por segurança.

    
por 29.12.2015 / 23:24