Скрипт Bash для копирования нумерованных файлов в обратном порядке - PullRequest
0 голосов
/ 21 августа 2011

У меня есть последовательность файлов:

image001.jpg
image002.jpg
image003.jpg

Можете ли вы помочь мне с bash сценарием, который копирует изображения в обратном порядке, так что конечный результат:

image001.jpg
image002.jpg
image003.jpg
image004.jpg  <-- copy of image003.jpg
image005.jpg  <-- copy of image002.jpg
image006.jpg  <-- copy of image001.jpg

Текст в скобках не является частью имени файла.

Зачем мне это нужно? Я создаю видео из последовательности изображений и хотел бы, чтобы видео воспроизводилось «вперед», а затем «назад» (зацикливание полученного видео).

Ответы [ 2 ]

3 голосов
/ 21 августа 2011

Вы можете использовать printf для печати числа с начальными 0.

$ printf '%03d\n' 1
001
$ printf '%03d\n' 2
002
$ printf '%03d\n' 3
003

Бросив это в цикл for, вы получите:

MAX=6

for ((i=1; i<=MAX; i++)); do
    cp $(printf 'image%03d.jpg' $i) $(printf 'image%03d.jpg' $((MAX-i+1)))
done
1 голос
/ 21 августа 2011

Я думаю, что для этого я бы использовал массив ... таким образом, вам не нужно жестко кодировать значение для $ 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, вы сталкиваетесь с восьмеричной проблемой.

...