Этот одноклассник сделает это:
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' -- {} \;
Я бы порекомендовал итеративный подход к рекурсивному. Чтобы отсканировать (Sub) каталоги, используйте инструмент «Find» и его аргумент «-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
Я еще не проверил код, но он должен дать вам хорошую идею, как следует выглядеть. Потенциальные проблемы могут быть пробелами в имена файлов; Переопределение, если может помочь вам.