переименование всех файлов во всех подкаталогах

Как переименовать все файлы во всех подкаталогах, с именем подкаталогов и автоматическим номером.

например:

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

переименовать в:

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

Я использую этот скрипт, но он не рекурсивный

 #!/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 

Этот однострочный лайнер сделает это:

 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' -- {} \; 

С расширением линии для упрощения чтения:

 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' -- {} \; 

Я бы рекомендовал итеративный подход к рекурсивному. Для сканирования (под) каталогов используйте инструмент «Найти» и его аргумент «-type d».

Пример:

 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 

Я еще не тестировал код, но он должен дать вам представление о том, как это должно выглядеть. Потенциальными проблемами могут быть пробелы в именах файлов; переопределение IFS может помочь вам.