Número do bloco dentro da string e renomear o arquivo [duplicado]

0

Eu tenho alguns nomes de arquivos como tal.

a2.txt.gz
d12.txt.gz
k5.txt.gz
m4.txt.gz
...

um caractere seguido por 1 ou 2 números seguidos por .txt.gz. Eu gostaria de adicionar números únicos com um zero antes do número abaixo.

a02.txt.gz
d12.txt.gz
k05.txt.gz
m04.txt.gz
...

Eu tentei algo assim, mas parece que não funciona.

find . | grep -E "[a-z][0-9]{1}\.+" | sed -er s/\([a-z]\)\([0-9]{1}\)\(.txt.gz\)//

Minha lógica era primeiro digitar nomes de arquivos de um dígito, então dividir em 3 partes de caractere, número e .txt.gz e então adicionar adicionar 0 antes do número. Mas eu não consigo fazer isso funcionar. E eu não tenho certeza sobre a parte da renomeação.

    
por rmf 29.06.2016 / 20:21

3 respostas

0

Eu faria assim: for f in [a-z][0-9].txt.gz; do mv $f "${f:0:1}0${f:1}" done

Eu adaptei isso de outra coisa (que usava awk porque precisava de mais, mas graças a um comentário eu o fiz melhor).

    
por 30.06.2016 / 00:12
0

Isso faria isso:

find . -name '??.txt.gz' | sed -e 's/..\(.\)\(.*\)/mv  /' > /tmp/cmds
sh /tmp/cmds

O comando find obtém a lista de arquivos que precisam ser renomeados. O comando sed constrói uma lista de comandos mv para fazer o que você deseja. Aqueles são gravados em um arquivo e depois executados como um script de shell.

Tenho certeza de que há uma maneira de fazer isso como uma linha direta, mas estou com preguiça.

    
por 29.06.2016 / 20:42
0

Com base em Preenchendo um número em um nome do arquivo para um tamanho fixo , eu achei isso para trabalhar para mim. Este é um caminho hacky e estou surpreso que não há maneira adequada / simples de fazer isso e sem programas ou funções adicionais.

var=$(find . | grep -E "[a-z][0-9]{1}\.+" | sed 's/\.\///')
for f in $var; do
    alpha=$(basename $f .gz | cut -c1-1)
    num=$(basename $f .gz | grep -o "[0-9]")
    zero=$(echo "0")
    new_name=$(printf "$alpha$zero$num.txt.gz")
    echo "Renaming $f to $new_name"
    [ ! -f $new_name ] && mv $f $new_name
done
    
por 29.06.2016 / 22:12

Tags