Vraag JPG-batchcompressie & naam wijzigen (find -exec, xargs, piping?)


dit is mijn eerste bericht dus ik hoop dat je zo vriendelijk zult zijn om me te vergeven als ik wat formatteerfouten maak of anders. Dit is een vraag die ik al geruime tijd heb en terwijl ik naar antwoorden op zoek ben, heb ik nog meer vragen. Ik probeerde een manier te vinden om afbeeldingen in een map te comprimeren met convert in één opdracht.

Eerst probeerde ik eenvoudig:

convert * -resize 50% Pic.jpg

Dit leverde echter de gecomprimeerde afbeeldingen Pic-0.jpg, Pic-1.jpg, etc. op (ik heb het ook geprobeerd $(find ".JPG") in plaats van * maar dit wordt uitgebreid naar hetzelfde. Om de opmaak te krijgen die ik wilde, probeerde ik:

convert * -resize 50% Pic_lorez_{1..3}.jpg

Maar dit leek de Pic_lorez_2.jpg en Pic3_lorez_3.jpg als invoerbestanden te nemen, niet als uitvoerbestanden. Dus na het advies van een vriend, probeerde ik:

find . -name "*.JPG" -exec convert {} -resize 50% {} \;

Dit comprimeert alle bestanden met dezelfde naam maar staat niet toe om de naam te geven die ik deze bestanden wil (bijvoorbeeld Pic_lorez_ {1,2,3,4,5, .. 100} .jpg).

Zou xargs het mogelijk maken? Iets in de trant van:

find . -name "*.JPG" | xargs convert ???

Ik kon de juiste syntaxis met xargs niet achterhalen. Ik heb eindelijk een directe pijp geprobeerd om in convert te vinden, maar converteren leek niet zo te kunnen werken.


4
2018-04-14 18:18


oorsprong




antwoorden:


convert schrijft naar een ander afbeeldingsbestand. Om originele beeldbestanden te overschrijven, gebruik mogrify.

Enkel bestand:

mogrify -resize 50% Pic.jpg 

Alle .jpg bestanden:

mogrify -resize 50% *.jpg

7
2018-04-14 18:59





Je zou deze voering kunnen gebruiken: for img in $(ls *.jpg); do convert $img -resize 50% $img;done;


4
2018-04-14 19:03





Probeer dit:

SIZE=50 ; find -iname "*.jpg" | while read line ; do NF="$(echo $line | sed -r "s/(\.jpg|\.JPG)/_$SIZE\1/")" ; convert "$line" -resize $SIZE% "$NF" ; done

Dat is echt niet alleen maar een regel. Hier is een ingesprongen versie:

SIZE=50
find -iname "*.jpg" | while read line ; do
  NF="$(echo $line | sed -r "s/(\.jpg|\.JPG)/_$SIZE\1/")"
  convert "$line" -resize $SIZE% "$NF"
done

U kunt de waarde van aanpassen SIZE naar een andere maat, in percentage.

Merk op dat na de eerste run, het ook de reeds geconverteerde bestanden als invoerbestanden zal gebruiken. U kunt bestanden met dezelfde naam overslaan _NUMBER.jpg door de parameter find aan te passen, of je kunt de geconverteerde bestanden ook ergens anders opslaan.


1
2018-04-14 18:58





Dit script zal het voor je doen!

Sla het op in een bestand en maak het bestand uitvoerbaar met: chmod +x filename.

#! / Bin / bash
SAVEIFS = $ IFS
IFS = $ (echo -en "\ n \ b")
C = 0;
DES = "./"; # Doelmap

voor img in `vinden. -maxdepth 1 -mindepth 1 -iname '* .jpg' -type f`
do
    ((++ C));
    NF = "$ {DES} Pic_lorez _ $ {C} .jpg"; # Nieuwe bestandsnaam
    converteer $ img - herzet 50% $ NF;
gedaan

# herstel $ IFS
IFS = $ SAVEIFS
  • Verander de ./ naar de map waar u geconverteerde afbeeldingen wilt plaatsen, standaard zet deze ze in de huidige map.
  • Verandering Pic_lorez_ naar welke naam je ook wilt geven aan geconverteerde bestanden.

1
2018-04-14 21:17





Gebruik GNU Parallel:

find -iname "*.jpg" | parallel convert {} -resize 50% {.}_50pct.jpg

en krijg de toegevoegde bonus dat alle CPU-kernen parallel werken en dus het proces versnellen.

10 seconden installatie:

wget pi.dk/3 -qO - | sh -x

Bekijk de introductievideo's voor meer informatie: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1


1
2018-04-20 15:37