Renomeia arquivos com subdiretórios counter over

1

Eu tenho um diretório pai com vários diretórios nele. Dentro desses eu, novamente, tenho vários subdiretórios, eles contêm muitas imagens:

Parent
|
├──dirA
|       ├──sub_A1
|       |     ├──00000001.jpg 
|       |     ├──00000002.jpg 
|       |     ├──00000003.jpg
|       |
|       ├──sub_A2
|             ├──00000001.jpg 
|             ├──00000002.jpg 
|             ├──00000003.jpg
|    
├──dirB
       ├──sub_B1
       |     ├──00000001.jpg 
       |     ├──00000002.jpg 
       |     ├──00000003.jpg
       |
       ├──sub_B2
             ├──00000001.jpg 
             ├──00000002.jpg 
             ├──00000003.jpg

Gostaria de renomear todas as imagens de maneira incremental, ou seja, 1.jpg, 2.jpg, 3.jpg etc. No entanto, não quero que o contador seja redefinido para os subdiretórios.

Então, essa seria a saída:

Parent
|   
├──dirA
|       ├──sub_A1
|       |     ├──1.jpg 
|       |     ├──2.jpg 
|       |     ├──3.jpg
|       |
|       ├──sub_A2
|             ├──4.jpg 
|             ├──5.jpg 
|             ├──6.jpg
|    
├──dirB
       ├──sub_B1
       |     ├──7.jpg 
       |     ├──8.jpg 
       |     ├──9.jpg
       |
       ├──sub_B2
             ├──10.jpg 
             ├──11.jpg 
             ├──12.jpg

Esta resposta quase parece ter a solução, mas o contador não reinicializa.

    
por apples-oranges 23.03.2016 / 17:37

1 resposta

0

O seguinte parece funcionar:

find DirPath -type f -name "*.*"|\
  for (( n=1;; ++n ));\
    do l="'line'"||break; mv "$l" "${l%/*}/$n.${l##*.}"; done

A cláusula -name é porque a divisão do nome do arquivo falha se não houver nenhum ponto, embora você possa preferir -iname "*.jpg" . A cláusula do poderia ser elaborada para manipular nomes de arquivos sem extensão.

Observe que line retorna um erro no final do arquivo, então ||break finaliza o loop.

Recomendo que você adicione echo antes de mv para garantir que o comando funcione como esperado: você pode salvar essa saída como uma referência às alterações feitas.

Se você precisar classificar os diretórios e arquivos antes de atribuir os números, o que parece ser uma coisa sensata, adicione um filtro de classificação, especificando / como um separador de campo:

find DirPath -type f -name "*.*"|sort -t /|\
  for (( n=1;; ++n ));\
    do l="'line'"||break; mv "$l" "${l%/*}/$n.${l##*.}"; done
    
por 23.03.2016 / 18:37