Я создал то же дерево и построил ваше движение. Вот что я придумал:
n=0 IFS=.; set -f ./[e]vent*/*/*
for f do [ -n "${f##./\[*}" ] || break
[ "$d" = "${f%/*}" ] || i=0 d=${f%/*}
mv=': mv "${'$((n=$n+1))'}" "${'$n'%%/*}/'
printf "$mv%.2d%.0s.%s\"\n" $((i=$i+1)) ${f##*/}
done | sh -sx -- "$@"
Без этой последней |
трубы на конце вот что он печатает:
mv "${1}" "${1%/*}/01.jpg"
mv "${2}" "${2%/*}/02.png"
mv "${3}" "${3%/*}/01.jpg"
mv "${4}" "${4%/*}/02.png"
mv "${5}" "${5%/*}/03.gif"
mv "${6}" "${6%/*}/01.jpg"
mv "${7}" "${7%/*}/02.png"
mv "${8}" "${8%/*}/01.jpg"
mv "${9}" "${9%/*}/02.png"
mv "${10}" "${10%/*}/03.gif"
Это не похоже на много, я знаю, но здесь важно то, что что вам не нужно беспокоиться о каких-либо странных именах файлов или о чем-либо из этого - предполагаемое место назначения для этого вывода - оболочка, которая разделяет позиционный массив с циклом for
, который его сгенерировал. У меня есть один такой в команде - и он настроен для предоставления отладочного вывода, который выглядит следующим образом:
+ : mv ./event-a/album-a/a.jpg ./event-a/album-a/01.jpg
+ : mv ./event-a/album-a/x.png ./event-a/album-a/02.png
+ : mv ./event-a/album-b/a.jpg ./event-a/album-b/01.jpg
+ : mv ./event-a/album-b/x.png ./event-a/album-b/02.png
+ : mv ./event-a/album-b/y.gif ./event-a/album-b/03.gif
+ : mv ./event-b/album-x/a.jpg ./event-b/album-x/01.jpg
+ : mv ./event-b/album-x/x.png ./event-b/album-x/02.png
+ : mv ./event-b/album-y/a.jpg ./event-b/album-y/01.jpg
+ : mv ./event-b/album-y/x.png ./event-b/album-y/02.png
+ : mv ./event-b/album-y/y.gif ./event-b/album-y/03.gif
Вот как это выглядит, когда :
является первым символом в Строка формата printf
. Когда я удаляю его и выполняю команду:
ls ./event*/*/
./event-a/album-a/:
01.jpg 02.png
./event-a/album-b/:
01.jpg 02.png 03.gif
./event-b/album-x/:
01.jpg 02.png
./event-b/album-y/:
01.jpg 02.png 03.gif
Это похоже на ваш запрос. Думаю, вы не сможете превзойти результаты.