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).
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.
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.
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