Renomeia todos os arquivos em um diretório para adicionar um zero à esquerda - para nomes de arquivos com 'hastes' variáveis

0

Eu tenho um diretório que possui um grande número de arquivos. Esses arquivos são nomeados de acordo com o sistema a seguir: "Var1_X_Var2_Y_Var3_Z_data_N.txt" Onde X, Y e Z são muitos números diferentes e N varia de 1 a 30.

Para usar esses arquivos no meu próximo script, preciso adicionar um zero à esquerda para os arquivos em que N é de 1 a 9.

Na minha máquina Ubuntu eu uso o seguinte comando

rename  's/_1.txt/_01.txt/' *

e repita de 1 a 9.
No entanto, esse comando não funcionará em um cluster que estou usando. Eu preciso de uma alternativa unix ou bash ou python.

(nota: Eu sei que há muitas questões relacionadas no stackexchange, mas todas elas parecem usar casos em que todos os arquivos compartilham o mesmo radical. Eu destruí vários arquivos tentando aplicar essas soluções)

    
por Bobby M 21.05.2018 / 19:25

2 respostas

2

Você deseja que o N em Var1_X_Var2_Y_Var3_Z_data_N.txt seja um inteiro de dois dígitos com zero.

Supondo que todos os arquivos afetados correspondam ao padrão *_[0-9].txt :

for name in *_[0-9].txt; do
    stem="${name%.txt}"    # remove the ".txt" suffix
    num=${stem##*_}        # extract the number at the end
    newname="${stem%[0-9]}$( printf '%02d.txt' "$num" )" # put it back together

    printf 'Would rename "%s" into "%s"\n' "$name" "$newname"
    # mv -- "$name" "$newname"
done
  • ${name%.txt} remove o .txt do final de $name , o nome do arquivo original. Isso cria o "tronco", que não é realmente o tronco, uma vez que ainda tem o número no final.
  • ${stem##*_} remove tudo até e incluindo o sublinhado último em $stem .
  • ${stem%[0-9]} é o radical sem o número no final (por exemplo, Var1_X_Var2_Y_Var3_Z_data_ ).
  • printf '%02d.txt' "$num" produz um número de dois dígitos preenchido com zero de $num , seguido pela string .txt .

Dado um diretório com os arquivos

Var1_X_Var2_Y_Var3_Z_data_1.txt              Var1_X_Var2_Y_Var3_Z_data_23.txt
Var1_X_Var2_Y_Var3_Z_data_10.txt             Var1_X_Var2_Y_Var3_Z_data_24.txt
Var1_X_Var2_Y_Var3_Z_data_11.txt             Var1_X_Var2_Y_Var3_Z_data_25.txt
Var1_X_Var2_Y_Var3_Z_data_12.txt             Var1_X_Var2_Y_Var3_Z_data_26.txt
Var1_X_Var2_Y_Var3_Z_data_13.txt             Var1_X_Var2_Y_Var3_Z_data_27.txt
Var1_X_Var2_Y_Var3_Z_data_14.txt             Var1_X_Var2_Y_Var3_Z_data_28.txt
Var1_X_Var2_Y_Var3_Z_data_15.txt             Var1_X_Var2_Y_Var3_Z_data_29.txt
Var1_X_Var2_Y_Var3_Z_data_16.txt             Var1_X_Var2_Y_Var3_Z_data_3.txt
Var1_X_Var2_Y_Var3_Z_data_17.txt             Var1_X_Var2_Y_Var3_Z_data_30.txt
Var1_X_Var2_Y_Var3_Z_data_18.txt             Var1_X_Var2_Y_Var3_Z_data_4.txt
Var1_X_Var2_Y_Var3_Z_data_19.txt             Var1_X_Var2_Y_Var3_Z_data_5.txt
Var1_X_Var2_Y_Var3_Z_data_2.txt              Var1_X_Var2_Y_Var3_Z_data_6.txt
Var1_X_Var2_Y_Var3_Z_data_20.txt             Var1_X_Var2_Y_Var3_Z_data_7.txt
Var1_X_Var2_Y_Var3_Z_data_21.txt             Var1_X_Var2_Y_Var3_Z_data_8.txt
Var1_X_Var2_Y_Var3_Z_data_22.txt             Var1_X_Var2_Y_Var3_Z_data_9.txt

.. esse loop produziria

Would rename "Var1_X_Var2_Y_Var3_Z_data_1.txt" into "Var1_X_Var2_Y_Var3_Z_data_01.txt"
Would rename "Var1_X_Var2_Y_Var3_Z_data_2.txt" into "Var1_X_Var2_Y_Var3_Z_data_02.txt"
Would rename "Var1_X_Var2_Y_Var3_Z_data_3.txt" into "Var1_X_Var2_Y_Var3_Z_data_03.txt"
Would rename "Var1_X_Var2_Y_Var3_Z_data_4.txt" into "Var1_X_Var2_Y_Var3_Z_data_04.txt"
Would rename "Var1_X_Var2_Y_Var3_Z_data_5.txt" into "Var1_X_Var2_Y_Var3_Z_data_05.txt"
Would rename "Var1_X_Var2_Y_Var3_Z_data_6.txt" into "Var1_X_Var2_Y_Var3_Z_data_06.txt"
Would rename "Var1_X_Var2_Y_Var3_Z_data_7.txt" into "Var1_X_Var2_Y_Var3_Z_data_07.txt"
Would rename "Var1_X_Var2_Y_Var3_Z_data_8.txt" into "Var1_X_Var2_Y_Var3_Z_data_08.txt"
Would rename "Var1_X_Var2_Y_Var3_Z_data_9.txt" into "Var1_X_Var2_Y_Var3_Z_data_09.txt"

Remova o comentado mv no final do loop para realmente renomear os arquivos.

    
por 21.05.2018 / 19:39
0
find -name "*_[1-9].txt" -exec sh -c 'echo $1 ${1%_*}_0${1##*_}' _ {} \;
  • O $1 está substituindo pelo arquivo encontrado.
  • O ${1%_*} está removendo tudo após último sublinhado e sublinhando a si mesmo.
  • Este _0 apenas imprime um sublinhado seguido por um zero.
  • Este ${1##*_} remove tudo antes do último sublinhado e sublinha a si mesmo.

substitua echo por mv para renomear arquivos.

Eu usei isso para criar arquivos de 3o

touch Var1_${RANDOM}_Var2_${RANDOM}_Var3_${RANDOM}_data_{1..30}.txt
    
por 21.05.2018 / 20:10