Jalankan perintah pada sepasang file

1

** Konteks: ** Saya telah memindai banyak gambar lama, yang memiliki tulisan di belakang.

Dengan menggunakan imagemagick, saya dapat menambahkan bagian depan dan belakang gambar seperti ini:

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

Masalah saya adalah saya punya banyak gambar untuk menerapkan perintah.

Apakah ada cara untuk meminta bash untuk menerapkan "montase" untuk setiap file aneh, menambahkan secara otomatis nama file yang datang setelahnya? Nama file keluaran juga merupakan masalah.

Manu
sumber

Jawaban:

4

Cepat dan kotor:

#!/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

Anda mengatakan untuk menerapkan montase ke file aneh tetapi diberikan bahkan dalam contoh Anda. Kode di atas akan berfungsi bahkan. Jika Anda perlu file aneh menjadi yang pertama, ubah saja baris ini:

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

menjadi ini:

if [ $((number % 2)) -eq 1 ]; then
djhowell
sumber
Mengesankan dan cepat! Saya akan mencobanya
Manu
Saya tidak tahu apakah setiap gambar "kiri" akan genap atau ganjil, yang saya yakin adalah mereka saling mengikuti ... Jadi, saya bisa memiliki out4.jpg out5.jpg out23.jpg out 24.jpg out 24.jpg .
Manu
Jika itu masalahnya maka Anda mungkin bisa menghapus baris yang dimulai dengan "jika" dan "fi".
djhowell
Bagus sekali! Terima kasih banyak. Sekarang saya harus men-tweak, sehingga akan mengambil file, menambahkannya ke file +1, dan kemudian melompat ke file +2 ....
Manu
1
Anda dapat melakukan sesuatu seperti nextfile=${file/$number/$nextnumber} dari pada sed dan kamu tidak perlu bc untuk penambahan integer - lakukan saja ((nextnumber = number + 1)).
Dennis Williamson