Я думаю, что для этого я бы использовал массив ... таким образом, вам не нужно жестко кодировать значение для $ MAX.
image=( image*.jpg )
MAX=${#image[*]}
for i in ${image[*]}
do
num=${i:5:3} # grab the digits
compliment=$(printf '%03d' $(echo $MAX-$num | bc))
ln $i copy_of_image$compliment.jpg
done
Я использовал 'bc' для арифметики, потому что bash интерпретирует начальные 0 как показатель того, что число является восьмеричным, а расширение параметра в bash недостаточно мощное, чтобы обрезать их без скачков. Я мог бы сделать это с помощью sed, но до тех пор, пока я вызывал что-то за пределами bash, имело такой же смысл делать арифметику напрямую.
Я полагаю, что сценарий Кугельмана мог бы сделать что-то вроде этого:
MAX=(ls image*.jpg | wc -l)
Однако у этого скрипта большие проблемы, потому что он перезаписывает половину изображений:
cp image001.jpg image006.jpg # wait wait!!! what happened to image006.jpg???
Кроме того, как только вы поднимаетесь выше 007, вы сталкиваетесь с восьмеричной проблемой.