Linux: renomeie várias imagens após o diretório pai e adicione o sufixo (lote)

0

Eu tenho um diretório de imagens com muitos mais subdiretórios que contêm imagens com, digamos, nomes de arquivos aleatórios.

images/black-shoe/gsafdfs.jpg
images/black-shoe/ggdfgdf.jpg
images/black-shoe/gdfgd3f.jpg
images/black-shoe/g4twegd.jpg

images/red-shoe/ggsdgdfs.jpg
images/red-shoe/gskjhkhf.jpg
images/red-shoe/gsakytfs.jpg

E eu quero lote renomear todas as imagens para o diretório pai, mas para evitar que um substitua o outro, adicione um sufixo assim.

images/black-shoe/black-shoe-1.jpg
images/black-shoe/black-shoe-2.jpg
images/black-shoe/black-shoe-3.jpg
images/black-shoe/black-shoe-4.jpg

images/red-shoe/red-shoe-1.jpg
images/red-shoe/red-shoe-2.jpg
images/red-shoe/red-shoe-3.jpg

Eu uso o Debian 8 e estou familiarizado com o uso da linha de comando. Idealmente, eu gostaria de um script pequeno ou oneliner que eu pudesse executar de dentro de imagens / para aplicá-las em todas as sub-pastas de uma só vez.

    
por johnny538 20.11.2016 / 17:24

1 resposta

0

Este pequeno script deve fazer o truque (os nomes de arquivos e diretórios podem conter espaços): (deve ser chamado com baseir como parâmetro)

#!/bin/bash

basedir=$1

while IFS= read -r -d '' path; 
do 
  dirn=$(basename "$path")
  echo "===> $path"
  let i=1
  while IFS= read -r -d '' fname; 
  do
    fext=$(echo "$fname" | awk -F '.' '{print $NF}')
    mv "$fname" "${path}/${dirn}-${i}.${fext}"
    let i=i+1
  done < <(find "$path" -maxdepth 1 -type f -print0)
done < <(find "$basedir" -type d -print0)
    
por 20.11.2016 / 19:19