Renomeia vários arquivos em sub-diretórios para seus nomes de diretórios

0

Eu tenho uma pasta na minha área de trabalho chamada Models. Na pasta, há pastas nomeadas com arquivos jpeg sem as extensões .jpg. Os nomes dos arquivos jpeg são hashes aleatórios. Eu gostaria de usar um script bash para lote renomear esses arquivos jpeg para seus nomes de diretório com incrementos e acrescentar a extensão .jpg em cada arquivo.

É basicamente algo como

Modelos /

 Alice/
      a5ccB2ff3e
      ee420bc4a
      2acee54dc
      ...
 Alex/
      de33fa24c0
      d1eaa48e0a
      ...

E eu quero ser como

Modelos /

 Alice/
      Alice001.jpg
      Alice002.jpg
      Alice003.jpg
      ...

 Alex/
      Alex001.jpg
      Alex002.jpg
      ...
    
por Boygee 18.11.2018 / 07:59

2 respostas

0

A partir da descrição da sua pergunta, estou assumindo que total não. de arquivos em uma pasta não excede 999.

Este é um script bash simples que é executado em seu diretório principal, por exemplo, Modelos:

#!/bin/bash
for i in ./*
do
if [ -d "$i" ]
then
j=001
for k in "$i"/*
do
mv "$k" "$i"/"$i""$j".jpg
j=${j#0}
if [ ${j:0:1} -eq 0 ]
then 
j=${j#0}
fi
(( j++ ))
j='printf '%03i' $j'
done
fi
done

Primeiro, ele verificará todos os arquivos em Modelos, seja um diretório ou não, por if [ -d "$i" ] . Então, para cada arquivo nesse diretório, ele mudará seus nomes por mv "$k" "$i"/"$i""$j".jpg . E

j=${j#0}
if [ ${j:0:1} -eq 0 ]
then 
j=${j#0}
fi

O código acima removerá todos os zeros do início para que você não receba o erro como:

 ((: 008: value too great for base (error token is "008")
 printf: 008: invalid octal number

e

j='printf '%03i' $j'

fará o valor de j 3 dígitos.

    
por 18.11.2018 / 08:24
0

Tente também esta versão simplificada da proposta do Debian_yadav:

for i in *
  do    if [ -d "$i" ] && cd "$i"
          then  j=0
                for k in *
                  do    ((j++))
                        echo mv "$k" $(printf "%s%03d.jpg" $i $j )
                  done
                cd ..
          fi
  done

O echo é apenas para depuração; remova se estiver satisfeito com o que você vê.

Ele cd s em cada diretório disponível, redefine o contador, faz um loop em todos os arquivos de destino, incrementa o contador para cada um e faz a renomeação.

    
por 18.11.2018 / 13:26