massa de arquivo BASH renomear com contador

3

Eu quero renomear todos os arquivos em uma pasta com PREFIX+COUNTER+FILENAME

por ex. entrada:

england.txt  
canada.txt  
france.txt

saída:

CO_01_england.txt  
CO_02_canada.txt  
CO_03_france.txt
    
por user3148655 08.05.2016 / 08:00

2 respostas

7

Isso faz o que você pergunta:

n=1; for f in *.txt; do mv "$f" "CO_$((n++))_$f"; done

Como funciona

  • n=1

    Isso inicializa a variável n para 1.

  • for f in *.txt; do

    Isso inicia um loop sobre todos os arquivos no diretório atual cujos nomes terminam com .txt .

  • mv "$f" "CO_$((n++))_$f"

    Isso renomeia os arquivos para ter o prefixo CO_ com n como o contador. O símbolo ++ informa ao bash para incrementar a variável n .

  • done

    Isso sinaliza o final do loop.

Melhoria

Esta versão usa printf , o que permite maior controle sobre como o número será formatado:

n=1; for f in *.txt; do mv "$f" "$(printf "CO_%02i_%s" "$n" "$f")"; ((n++)); done

Em particular, o formato %02i colocará um zero à esquerda antes do número quando n ainda estiver em um dígito.

    
por 08.05.2016 / 08:04
1

Com o utilitário prename encontrado no Debian e derivados ou disponível em outros sistemas instalando o pacote Perl Unicode::Tussle :

prename 's ([^/]*\z) (sprintf("C0_%02d_%s", ++$n, $&))e' england.txt canada.txt france.txt

Explicação: para cada argumento, renomeie o nome base (o maior sufixo que não contém uma barra) para C0_ , seguido pelo valor do contador $n (incrementado antes do uso, iniciando em 0 antes da primeira incrementação e uso) formatado para dois dígitos decimais, seguidos por _ , seguido pelo nome original. Para renomear todos os arquivos com a extensão .txt , com a numeração em ordem lexicográfica:

prename 's ([^/]*\z) (sprintf("C0_%02d_%s", ++$n, $&))e' *.txt

Com o comando zsh, use a função zmv e o < href="http://zsh.sourceforge.net/Doc/Release/Expansion.html#Parameter-Expansion-Flags"> sinalizador de expansão de parâmetro l para preencher o número:

autoload -U zmv
zmv '*.txt' '$f:h/C0_${(l:2::0:)$((++x))}_$f:t'
    
por 09.05.2016 / 01:17

Tags