Renomeando arquivos com prefixo e sufixo em pastas de diferentes profundidades

1

Tenho muitas imagens de extensões variadas (jpeg, jpg, png) contidas em muitos diretórios diferentes, muitos dos quais podem estar contidos em outras pastas para organização.

Como:

Folder 1/
Folder A/
     Image 01.jpg
     Image 02.png
Folder 2/
     Folder B/
          Folder C/
               Image 03.jpeg
               Image 04.png

A hierarquia e as pastas mudam dependendo do que estou trabalhando. Eu normalmente preciso anexar a pasta mãe das imagens como o prefixo, e dar às páginas um sufixo numérico de Page 001.002 etc.

Normalmente, eu estou indo para cada pasta e lote nomeando todas as imagens na pasta com o programa Pyrenamer, mas isso leva um tempo significativo. 50 trabalhos para 50 pastas, por exemplo.

Eu sei que um script pode ser feito (de preferência um script nautilus) que eu possa usar em uma única pasta contendo as muitas pastas para realizar o trabalho.

Por exemplo, "Image 01.jpg" seria renomeado para "Folder A - Page 001.jpg", enquanto "Image 04.png" seria renomeado para "Folder C - Page 004.png". As imagens estão em uma ordem específica e precisam ser renomeadas e numeradas na mesma ordem de antes, apenas com um prefixo e um sufixo corretos.

O Pyrenamer pode realizar o sufixo, mas só permite renomear usando o diretório atual (não pai), tornando inútil o prefixo necessário.

Meu conhecimento de terminal é limitado, assim como meu conhecimento de programação. Qualquer ajuda seria muito apreciada e aceleraria muito o meu fluxo de trabalho.

    
por KhaosDvorak 26.04.2015 / 22:31

2 respostas

1

Esse script bash deve fazer: o caminho para manipular deve ser passado para ele como um argumento (isso é intencional), por exemplo:

./script.sh <directory>
#!/bin/bash

while read filepath
do
    newpath="$(<<< "$filepath" sed 's/^\(.*\)\/\(.*\)\/[^ ]*\(.*\)$/\/\/Folder  - Page 0/')"
    mv "$filepath" "$newpath"
done <<< "'find  -type f \( -iname '*.png' -o -iname '*.jpeg' -o -iname '*.jpg' \)'"

Antes:

<directory>
├── f1
│   ├── Image 01.png
│   ├── Image 02.png
│   └── Image 03.jpeg
├── f2
│   └── f2.1
│       ├── Image 04.jpeg
│       ├── Image 05.jpg
│       └── Image 06.jpg
└── f3
    └── f3.1
        └── f3.1.1
            ├── Image 07.png
            ├── Image 08.png
            └── Image 09.jpeg

Depois:

<directory>
├── f1
│   ├── Folder f1 - Page  001.png
│   ├── Folder f1 - Page  002.png
│   └── Folder f1 - Page  003.jpeg
├── f2
│   └── f2.1
│       ├── Folder f2.1 - Page  004.jpeg
│       ├── Folder f2.1 - Page  005.jpg
│       └── Folder f2.1 - Page  006.jpg
└── f3
    └── f3.1
        └── f3.1.1
            ├── Folder f3.1.1 - Page  007.png
            ├── Folder f3.1.1 - Page  008.png
            └── Folder f3.1.1 - Page  009.jpeg

    
por kos 26.04.2015 / 23:33
1

Assumindo que a pasta contenha apenas os arquivos que você deseja renomear e que você está usando o bash:

$ shopt -s globstar
$ rename -n 's;/([^/]*)/([^/]*) (\d+)\.(\w+)$;sprintf("/%s/%s - Page %03d.%s", , , , );e' ./Folder*/**/*
./Folder 2/Folder B/Folder C/Image 03.jpeg renamed as ./Folder 2/Folder B/Folder C/Folder C - Page 003.jpeg
./Folder 2/Folder B/Folder C/Image 04.png renamed as ./Folder 2/Folder B/Folder C/Folder C - Page 004.png
./Folder A/Image 01.jpg renamed as ./Folder A/Folder A - Page 001.jpg
./Folder A/Image 02.png renamed as ./Folder A/Folder A - Page 002.png

rename é um script em Perl muito útil para renomear arquivos. Neste caso, eu uso um regex que:

  • /([^/]*)/ - corresponde a um componente de diretório, limitado por barras.
  • ([^/]*) - corresponde a um prefixo do nome do arquivo, sucedido por um espaço
  • (\d+) - corresponde aos dígitos do nome do arquivo
  • \.(\w+) - corresponde à extensão
  • $ todos ancorados no final do nome do arquivo.

Depois, uso sprintf para imprimir os valores correspondentes da maneira desejada. Varie os 3 em %03d para obter mais preenchimento.

O ** em ./Folder*/**/* é um glob recursivo, e é por isso que preciso ativar globstar .

    
por muru 26.04.2015 / 23:41