renomeando todos os arquivos em todos os subdiretórios

6

Como renomear todos os arquivos em todos os subdiretórios, com o nome do subdiretório e o número automático.

ex:

parent
-subdir
--file.jpg
--cat.jpg
--dog.jpg

renomeie para:

parent
-subdir
--subdir_01.jpg
--subdir_02.jpg
--subdir_03.jpg

Estou usando este script, mas não é recursivo

#!/bin/bash
a=1
b="$1"
for i in *.jpg; do
  new=$(printf "%04d" ${a}) #04 pad to length of 4
  mv "${i}" ""$1"_${new}.jpg"
  let a=a+1
done
    
por juicebyah 22.12.2014 / 18:44

2 respostas

2

Este one-liner fará isso:

find path/ -name '*.jpg' -exec bash -c 'dn=$(dirname "$1"); bn=$(basename "$dn"); c=$(ls "$dn/$bn"_??.jpg 2>/dev/null | wc -l); c=$((c+1)); cnt=$(printf "%02d" $c); mv "$1" "$dn/${bn}"_$cnt.jpg' -- {} \;

Com a linha quebrada para facilitar a leitura:

find path/ -name '*.jpg' -exec bash -c '\
  dn=$(dirname "$1"); bn=$(basename "$dn"); \
  c=$(ls "$dn/$bn"_??.jpg 2>/dev/null | wc -l); c=$((c+1)); \
  cnt=$(printf "%02d" $c); mv "$1" "$dn/${bn}"_$cnt.jpg' -- {} \;
    
por 22.12.2014 / 23:17
0

Eu recomendaria uma abordagem iterativa sobre uma abordagem recursiva. Para procurar por (sub) diretórios, use a ferramenta 'find' e seu argumento '-type d'.

Exemplo:

find parentdir -type d | while read d ; do
    a=1
    # For example, $d could be "parent/subdir"
    b="$(basename $d)"
    # For above example, $b would be "subdir"
    for i in "${d}/*.jpg" ; do
        new=$(printf "%04d" ${a})
        mv "${i}" "${d}/${b}_${new}.jpg"
        let a=a+1
    done
done

Ainda não testei o código, mas ele deve dar uma boa ideia de como ele deve ser. Problemas potenciais podem ser espaços em nomes de arquivos; redefinir o IFS pode ajudá-lo.

    
por 22.12.2014 / 21:23

Tags