Выполнить команду на паре файлов

455
Manu

** Контекст: ** Я отсканировал много старых картинок с надписью на обороте.

Используя imagemagick, я могу добавить переднюю и заднюю часть изображения следующим образом:

montage out20.jpg out21.jpg -gravity center -geometry +1+1 -tile 1x2 out2021.jpg; rm out20.jpg out21.jpg; #(vertical append) 

Моя проблема в том, что у меня много картинок для применения команды.

Есть ли способ попросить bash применить «монтаж» к каждому нечетному файлу, автоматически добавляя имя файла, которое идет после него? Выходное имя файла также является проблемой.

1

1 ответ на вопрос

4
djhowell

Quick and dirty:

#!/bin/bash ls *.jpg | while read file do number=`echo $file | tr -dc 0-9`; if [ $((number % 2)) -eq 0 ]; then nextnumber=`echo $number + 1 | bc`; nextfile=`echo $file | sed s/$number/$nextnumber/`; outfile=`echo $file | sed s/$number/$number$nextnumber/`; montage $file $nextfile -gravity center -geometry +1+1 -tile 1x2 $outfile fi done 

You said to apply the montage to the odd files but provided even in your example. The code above will work for even. If you need the odd files to be first just change this line:

if [ $((number % 2)) -eq 0 ]; then 

to be this:

if [ $((number % 2)) -eq 1 ]; then 
Впечатляет и быстро! Я попробую это Manu 14 лет назад 0
Я не знаю, будет ли каждое «левое» изображение четным или нечетным, все, в чем я уверен, это то, что они следуют друг за другом ... Итак, я мог бы иметь out4.jpg out5.jpg out23.jpg out 24.jpg , Manu 14 лет назад 0
Если это так, то вы можете просто удалить строки, начинающиеся с «if» и «fi». djhowell 14 лет назад 0
Works great ! Thank very much. Now I have to tweak it, so that it'll take a file, append it to file+1, and then jump to file+2 .... Manu 14 лет назад 0
Я сделал это со счетчиком; Я проверяю, если это даже. Еще раз спасибо, вы качаетесь в bash :) Manu 14 лет назад 0
Я использовал "ls -v", для естественной сортировки Manu 14 лет назад 0
Вы можете сделать что-то вроде `nextfile = $ ` вместо `sed`, и вам не нужно` bc` для целочисленного добавления - просто сделайте `((nextnumber = number + 1))` , Dennis Williamson 14 лет назад 1

Похожие вопросы