ImageMagick su più file


9

Ho convertito un singolo file da BMP in PNG con ImageMagick convertusando il comando seguente

convert CD\ Front.bmp CD\ Front.png

Ho molti di questi file, quindi ho provato:

for f in */*.bmp ; do convert $f ${f%bmp}png; done

ma questo comando si blocca per sempre.

Che cosa sto facendo di sbagliato?

Risposte:


12

Molto probabilmente hai un problema perché non citi i nomi dei file:

for f in */*.bmp ; do convert "$f" "${f%bmp}png" ; done
#                             ^  ^ ^           ^

farlo in modo che lo spazio nei nomi dei file non causi problemi.


3
$fdovrebbe essere citato anche
Mat

Hai ragione, grazie per aver sottolineato
Zelda,

1
Citando le variabili è corretto, ma se si cita il glob allora la shell cercherà un valore letterale */*.bmp.
evilsoup,

Grazie anche a te Dovrei provare le mie soluzioni prima di pubblicare ...
Zelda,


1

Rifiuterei il codice in questo modo. Trovo che questo metodo sia più chiaro e più facile da eseguire il debug:

find . -type f -name '*.bmp' |\
  while read BMP
  do
    DIR=$(dirname "$BMP")
    PNG="$(echo $BMP | sed 's/.bmp//g')"
    convert "${BMP}" "${PNG}".png
  done

1
Mi sono preso la libertà di cambiare JPEG in PNG durante la revisione
Anthon,

Ah grazie. Ma ha funzionato anche per JPEG!
Jake Gould,

1
Sì, suppongo che lo sia, ma non era quello che l'OP aveva richiesto ;-)
Anthon,

Non usare find | while read, specialmente quando sarà sufficiente un glob.
Kevin,

E la sed sarebbe migliore come 's/\.bmp$/.png/', quindi ovviamente rimuovere il .png dal comando effettivo
Kevin,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.