2009-02-18 17 views
7

Chciałbym zmienić rozmiar wszystkich obrazów w katalogu. Aby to osiągnąć, używam convert z imagemagick. Chciałbym zmienić rozmiarZmiana rozmiaru listy obrazów w wierszu polecenia

image1.jpg 
image2.jpg 
... 

do

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

Zastanawiałem się, czy istnieje sposób, aby osiągnąć to w jednym wierszu poleceń. Eleganckie rozwiązanie może być często przydatne, nie tylko w tym przypadku.

EDIT:

Chciałbym nonskrypt jak rozwiązanie, tj. bez pętli for.

Odpowiedz

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

można wyeliminować sed i be-generic-extension, jeśli chcesz zaakceptować nieco inną nazwę pliku końcowego, "resized-image1.jpg" zamiast "resized-image1.jpg" zamiast "resized-image1.jpg" Image1-resized.jpg ':

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

To był rodzaj sztuczki myślałem o, ładny jeden;) – claf

+0

Dobrze! To jest to czego chce! Bez rury sed byłoby idealne, bez względu na to, czy rozmiar jest na początku. –

10

Jeśli chcesz zmieniać ich rozmiar do 800x600:

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

(prace w bash)

+0

+1 To jest dokładnie to samo, używam –

2

Jeśli twoje pliki graficzne mają różne rozszerzenia:

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

GNU Parallel jest jeszcze łatwiejsze niż dla pętli, i to często szybciej:

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

Kilka rzeczy się tu dzieje, od prawej do lewej:

  • ::: *.jpg oznacza uruchomienie polecenia dla każdego pliku jpg
  • {.} oznacza wstawienie bieżącej nazwy pliku bez sufiksu (.jpg)
  • {} środki wstawić bieżącą pliku
  • parallel środki uruchamiania Następujące polecenie wielokrotnie równoległe. Będzie on wybierał maksimum do wykonania równolegle, aby dopasować liczbę rdzeni twojego komputera. Gdy skończysz, uruchamia następny, aż wszystkie pliki jpg zostaną przekonwertowane.

To uruchamia polecenie convert --resize 800x600 -- foo.jpg foo-resized.jpg dla każdego pliku. -- informuje o konwersji do zatrzymywania przetwarzania flag, na wypadek gdyby nazwa pliku zaczęła się od -.

P.S. Na moim mac mam Homebrew zainstalowany, więc udało mi się zainstalować równolegle i konwertowania z

brew install parallel 
brew install imagemagick 
+0

Dobra odpowiedź - to jest droga. Nie jestem pewien, co to jest "-". –

Powiązane problemy