2009-02-18 2 views
7

Я хотел бы изменить размер списка изображений, все в каталоге. Для этого я использую convert от imagemagick. Я хотел бы изменить размерИзменение размера списка изображений в строке

image1.jpg 
image2.jpg 
... 

в

image1-resized.jpg 
image2-resized.jpg 
... 

мне было интересно, если есть способ для достижения этой цели в одной командной строке. Элегантное решение может быть полезно не только в этом случае.

EDIT:

Я хотел бы нонсценария как решение, то есть. без цикла.

ответ

6
ls *.jpg|sed -e 's/\..*//'|xargs -I X convert X.jpg whatever-options X-resized.jpg 

Вы можете устранить sed и быть расширением-generic, если вы готовы принять немного другое окончательное имя файла, 'resized-image1.jpg' вместо ' image1-resized.jpg ':

ls|xargs -I X convert X whatever-options resized-X 
+0

это был вид трюк, я думал о том, хороший один;) – claf

+0

Правильно! Это то, что я хочу! Без соединительной трубы было бы идеально, независимо от того, изменился ли размер в начале –

10

Если вы хотите изменить их размер до 800x600:

for file in *.jpg; do convert -resize 800x600 -- "$file" "${file%%.jpg}-resized.jpg"; done 

(работает в Баш)

+0

+1 Это точно то же самое, я использую –

2

Если ваши графические файлы имеют различные расширения:

 
for f in *; do convert -resize 800x600 -- "$f" "${f%.*}-resized.${f##*.}"; done 
4

GNU Parallel даже проще, чем для петель, и это часто быстрее:

parallel convert -resize 800x600 -- "{}" "{.}-resized.jpg" ::: *.jpg 

Несколько вещей происходит здесь, справа налево:

  • ::: *.jpg означает выполнение команды для каждого файла jpg.
  • {.} означает вставить текущее имя файла без суффикс (.jpg)
  • {} средство вставить текущее имя файла
  • parallel средства выполните следующую команду много раз параллельно. Он будет выбирать макс, чтобы сделать это параллельно, чтобы соответствовать количеству ядер вашего компьютера. По мере завершения каждого из них он запускает следующий, пока все файлы jpg не будут преобразованы.

Выполняет команду convert --resize 800x600 -- foo.jpg foo-resized.jpg для каждого файла. -- сообщает конвертировать, чтобы остановить обработку флагов, в случае, если имя файла начинается с -.

P.S. На мой макинтош у меня Homebrew установлен, так что я смог установить параллельно и конвертировать с

brew install parallel 
brew install imagemagick 
+0

Хороший ответ - это путь. Не знаю, что такое '' '' '' '. –

Смежные вопросы