Nalezení a konvert obrázků

Honza1

Nalezení a konvert obrázků
« kdy: 24. 08. 2015, 12:25:45 »
ahoj

Chtěl bzch se zeptat, jak najít ve složce a podsložkách všechny obrázky jednoho typu, např. gif a zkovertovat je do PNG a smazat původní. Ostatní typy (JPG) nechat, a rozbalit všechny archívy s danou příponou. Zkoušel jsem na to napsat skript, ale vždy se to zacyklilo. MOžná by to nějak šlo pomocí find.
« Poslední změna: 24. 08. 2015, 19:33:47 od Roman Bořánek »


Zopper

  • *****
  • 898
    • Zobrazit profil
Re:Nalezení a a konvert obrázků
« Odpověď #1 kdy: 24. 08. 2015, 12:41:54 »
Rozděl si to na 2 nezávislé úkoly:
1) najít a upravit obrázky
2) rozbalit archiv

Find pro nalezení všech souborů s příponou .gif se určitě použít dá:
Kód: [Vybrat]
find .  -name "*.gif".Pak záleží, co konkrétně s těmi soubory děláš. Pokud je to něco jednoduchého, tak by šlo použít xargs:
Kód: [Vybrat]
find [argumenty] | xargs příkaz [argumenty]xargs zajistí předání standardního vstupu (to, co dostane přes rouru) jako argument svého příkazu. (find something | xargs rm tedy zavolá "rm něco" pro každý řádek co vyplivne find.)

Pokud děláš něco složitějšího, tak bude jednodušší si výstup find uložit do proměnné a procházet v cyklu. Jen pozor, pokud se ti ve jménech souborů/adresářů mohou vyskytnout mezery, tak to budeš muset náležitě ošetřit (možný hint: IFS).


Honza1

Re:Nalezení a a konvert obrázků
« Odpověď #2 kdy: 24. 08. 2015, 13:58:53 »
Rozdělení úkolů určitě, jen jsem to shrnul do jednoho dotazu.

Nějak takto ?
for i in `find .  -name "*.gif"`; do j=`echo ${i} | sed 's/.gif//g'` ; convert -quality 100 ${i} ${j}.png ; rm ${i}  ; done
Funguje a jména sedí. Archivy budou podobně.

Co se táče mezer (diakritiky a podobného bordelu), tak už jsem se poučil. Jména souborů a složek jedině z alfanumerických znaků (62) a podtržítka.

Honza1

Re:Nalezení a a konvert obrázků
« Odpověď #3 kdy: 24. 08. 2015, 14:08:34 »
Sada příkazů pro cnvert se zaqchováním hlobky 8 a 24 bit (jpg a pod. schválně nezahrnuto - tam už je komprese dost).

for i in `find .  -name "*.gif"`; do j=`echo ${i} | sed 's/.gif//g'` ; convert -quality 100 ${i} ${j}.png ; rm ${i}  ; done
for i in `find .  -name "*.GIF"`; do j=`echo ${i} | sed 's/.GIF//g'` ; convert -quality 100 ${i} ${j}.png ; rm ${i}  ; done
for i in `find .  -name "*.Gif"`; do j=`echo ${i} | sed 's/.Gif//g'` ; convert -quality 100 ${i} ${j}.png ; rm ${i}  ; done
for i in `find .  -name "*.png"`; do j=`echo ${i} | sed 's/.png//g'` ; convert ${i} ${j}.bmp ; rm ${i}  ; done
for i in `find .  -name "*.PNG"`; do j=`echo ${i} | sed 's/.PNG//g'` ; convert ${i} ${j}.bmp ; rm ${i}  ; done
for i in `find .  -name "*.Png"`; do j=`echo ${i} | sed 's/.Png//g'` ; convert ${i} ${j}.bmp ; rm ${i}  ; done
for i in `find .  -name "*.bmp"`; do j=`echo ${i} | sed 's/.bmp//g'` ; convert -quality 100 ${i} ${j}.png ; rm ${i}  ; done
for i in `find .  -name "*.BMP"`; do j=`echo ${i} | sed 's/.Bmp//g'` ; convert -quality 100 ${i} ${j}.png ; rm ${i}  ; done
for i in `find .  -name "*.Bmp"`; do j=`echo ${i} | sed 's/.Bmp//g'` ; convert -quality 100 ${i} ${j}.png ; rm ${i}  ; done
for i in `find .  -name "*.tif"`; do j=`echo ${i} | sed 's/.tif//g'` ; convert -quality 100 ${i} ${j}.png ; rm ${i}  ; done
for i in `find .  -name "*.TIF"`; do j=`echo ${i} | sed 's/.TIF//g'` ; convert -quality 100 ${i} ${j}.png ; rm ${i}  ; done
for i in `find .  -name "*.Tif"`; do j=`echo ${i} | sed 's/.Tif//g'` ; convert -quality 100 ${i} ${j}.png ; rm ${i}  ; done
for i in `find .  -name "*.tiff"`; do j=`echo ${i} | sed 's/.tiff//g'` ; convert -quality 100 ${i} ${j}.png ; rm ${i}  ; done
for i in `find .  -name "*.TIFF"`; do j=`echo ${i} | sed 's/.TIFF//g'` ; convert -quality 100 ${i} ${j}.png ; rm ${i}  ; done
for i in `find .  -name "*.Tiff"`; do j=`echo ${i} | sed 's/.Tiff//g'` ; convert -quality 100 ${i} ${j}.png ; rm ${i}  ; done
for i in `find .  -name "*.pcx"`; do j=`echo ${i} | sed 's/.pcx//g'` ; convert -quality 100 ${i} ${j}.png ; rm ${i}  ; done
for i in `find .  -name "*.PCX"`; do j=`echo ${i} | sed 's/.PCX//g'` ; convert -quality 100 ${i} ${j}.png ; rm ${i}  ; done
for i in `find .  -name "*.Pcx"`; do j=`echo ${i} | sed 's/.Pcx//g'` ; convert -quality 100 ${i} ${j}.png ; rm ${i}  ; done
for i in `find .  -name "*.ico"`; do j=`echo ${i} | sed 's/.ico//g'` ; convert -quality 100 ${i} ${j}.png ; rm ${i}  ; done
for i in `find .  -name "*.ICO"`; do j=`echo ${i} | sed 's/.ICO//g'` ; convert -quality 100 ${i} ${j}.png ; rm ${i}  ; done
for i in `find .  -name "*.Ico"`; do j=`echo ${i} | sed 's/.Ico//g'` ; convert -quality 100 ${i} ${j}.png ; rm ${i}  ; done
for i in `find .  -name "*.raw"`; do j=`echo ${i} | sed 's/.raw//g'` ; convert -quality 100 ${i} ${j}.png ; rm ${i}  ; done
for i in `find .  -name "*.RAW"`; do j=`echo ${i} | sed 's/.RAW//g'` ; convert -quality 100 ${i} ${j}.png ; rm ${i}  ; done
for i in `find .  -name "*.Raw"`; do j=`echo ${i} | sed 's/.Raw//g'` ; convert -quality 100 ${i} ${j}.png ; rm ${i}  ; done

Honza1

Re:Nalezení a a konvert obrázků
« Odpověď #4 kdy: 24. 08. 2015, 14:30:09 »
A pro 8-bit hloubku u všech obrázků

for i in `find .  -name "*.png"`; do j=`echo ${i} | sed 's/.png//g'` ; convert -quality 100 ${i} ${j}.png ; rm ${i}  ; done
for i in `find .  -name "*.PNG"`; do j=`echo ${i} | sed 's/.PNG//g'` ; convert -quality 100 ${i} ${j}.png ; rm ${i}  ; done
for i in `find .  -name "*.Png"`; do j=`echo ${i} | sed 's/.Png//g'` ; convert -quality 100 ${i} ${j}.png ; rm ${i}  ; done
for i in `find .  -name "*.bmp"`; do j=`echo ${i} | sed 's/.bmp//g'` ; convert -quality 100 ${i} ${j}.gif ; rm ${i}  ; done
for i in `find .  -name "*.BMP"`; do j=`echo ${i} | sed 's/.Bmp//g'` ; convert -quality 100 ${i} ${j}.gif ; rm ${i}  ; done
for i in `find .  -name "*.Bmp"`; do j=`echo ${i} | sed 's/.Bmp//g'` ; convert -quality 100 ${i} ${j}.gif ; rm ${i}  ; done
for i in `find .  -name "*.tif"`; do j=`echo ${i} | sed 's/.tif//g'` ; convert -quality 100 ${i} ${j}.gif ; rm ${i}  ; done
for i in `find .  -name "*.TIF"`; do j=`echo ${i} | sed 's/.TIF//g'` ; convert -quality 100 ${i} ${j}.gif ; rm ${i}  ; done
for i in `find .  -name "*.Tif"`; do j=`echo ${i} | sed 's/.Tif//g'` ; convert -quality 100 ${i} ${j}.gif ; rm ${i}  ; done
for i in `find .  -name "*.tiff"`; do j=`echo ${i} | sed 's/.tiff//g'` ; convert -quality 100 ${i} ${j}.gif ; rm ${i}  ; done
for i in `find .  -name "*.TIFF"`; do j=`echo ${i} | sed 's/.TIFF//g'` ; convert -quality 100 ${i} ${j}.gif ; rm ${i}  ; done
for i in `find .  -name "*.Tiff"`; do j=`echo ${i} | sed 's/.Tiff//g'` ; convert -quality 100 ${i} ${j}.gif ; rm ${i}  ; done
for i in `find .  -name "*.pcx"`; do j=`echo ${i} | sed 's/.pcx//g'` ; convert -quality 100 ${i} ${j}.gif ; rm ${i}  ; done
for i in `find .  -name "*.PCX"`; do j=`echo ${i} | sed 's/.PCX//g'` ; convert -quality 100 ${i} ${j}.gif ; rm ${i}  ; done
for i in `find .  -name "*.Pcx"`; do j=`echo ${i} | sed 's/.Pcx//g'` ; convert -quality 100 ${i} ${j}.gif ; rm ${i}  ; done
for i in `find .  -name "*.ico"`; do j=`echo ${i} | sed 's/.ico//g'` ; convert -quality 100 ${i} ${j}.gif ; rm ${i}  ; done
for i in `find .  -name "*.ICO"`; do j=`echo ${i} | sed 's/.ICO//g'` ; convert -quality 100 ${i} ${j}.gif ; rm ${i}  ; done
for i in `find .  -name "*.Ico"`; do j=`echo ${i} | sed 's/.Ico//g'` ; convert -quality 100 ${i} ${j}.gif ; rm ${i}  ; done
for i in `find .  -name "*.raw"`; do j=`echo ${i} | sed 's/.raw//g'` ; convert -quality 100 ${i} ${j}.gif ;rm ${i}  ; done
for i in `find .  -name "*.RAW"`; do j=`echo ${i} | sed 's/.RAW//g'` ; convert -quality 100 ${i} ${j}.gif ; rm ${i}  ; done
for i in `find .  -name "*.Raw"`; do j=`echo ${i} | sed 's/.Raw//g'` ; convert -quality 100 ${i} ${j}.gif ; rm ${i}  ; done
for i in `find .  -name "*.gif"`; do j=`echo ${i} | sed 's/.gif//g'` ; convert -quality 100 ${i} ${j}.png ; rm ${i}  ; done
for i in `find .  -name "*.GIF"`; do j=`echo ${i} | sed 's/.GIF//g'` ; convert -quality 100 ${i} ${j}.png ; rm ${i}  ; done
for i in `find .  -name "*.Gif"`; do j=`echo ${i} | sed 's/.Gif//g'` ; convert -quality 100 ${i} ${j}.png ; rm ${i}  ; done



neruda

Re:Nalezení a a konvert obrázků
« Odpověď #5 kdy: 24. 08. 2015, 14:59:06 »
A pro 8-bit hloubku u všech obrázků

for i in `find .  -name "*.png"`; do j=`echo ${i} | sed 's/.png//g'` ; convert -quality 100 ${i} ${j}.png ; rm ${i}  ; done
for i in `find .  -name "*.PNG"`; do j=`echo ${i} | sed 's/.PNG//g'` ; convert -quality 100 ${i} ${j}.png ; rm ${i}  ; done
for i in `find .  -name "*.Png"`; do j=`echo ${i} | sed 's/.Png//g'` ; convert -quality 100 ${i} ${j}.png ; rm ${i}  ; done
for i in `find .  -name "*.bmp"`; do j=`echo ${i} | sed 's/.bmp//g'` ; convert -quality 100 ${i} ${j}.gif ; rm ${i}  ; done
for i in `find .  -name "*.BMP"`; do j=`echo ${i} | sed 's/.Bmp//g'` ; convert -quality 100 ${i} ${j}.gif ; rm ${i}  ; done
for i in `find .  -name "*.Bmp"`; do j=`echo ${i} | sed 's/.Bmp//g'` ; convert -quality 100 ${i} ${j}.gif ; rm ${i}  ; done
for i in `find .  -name "*.tif"`; do j=`echo ${i} | sed 's/.tif//g'` ; convert -quality 100 ${i} ${j}.gif ; rm ${i}  ; done
for i in `find .  -name "*.TIF"`; do j=`echo ${i} | sed 's/.TIF//g'` ; convert -quality 100 ${i} ${j}.gif ; rm ${i}  ; done
for i in `find .  -name "*.Tif"`; do j=`echo ${i} | sed 's/.Tif//g'` ; convert -quality 100 ${i} ${j}.gif ; rm ${i}  ; done
for i in `find .  -name "*.tiff"`; do j=`echo ${i} | sed 's/.tiff//g'` ; convert -quality 100 ${i} ${j}.gif ; rm ${i}  ; done
for i in `find .  -name "*.TIFF"`; do j=`echo ${i} | sed 's/.TIFF//g'` ; convert -quality 100 ${i} ${j}.gif ; rm ${i}  ; done
for i in `find .  -name "*.Tiff"`; do j=`echo ${i} | sed 's/.Tiff//g'` ; convert -quality 100 ${i} ${j}.gif ; rm ${i}  ; done
for i in `find .  -name "*.pcx"`; do j=`echo ${i} | sed 's/.pcx//g'` ; convert -quality 100 ${i} ${j}.gif ; rm ${i}  ; done
for i in `find .  -name "*.PCX"`; do j=`echo ${i} | sed 's/.PCX//g'` ; convert -quality 100 ${i} ${j}.gif ; rm ${i}  ; done
for i in `find .  -name "*.Pcx"`; do j=`echo ${i} | sed 's/.Pcx//g'` ; convert -quality 100 ${i} ${j}.gif ; rm ${i}  ; done
for i in `find .  -name "*.ico"`; do j=`echo ${i} | sed 's/.ico//g'` ; convert -quality 100 ${i} ${j}.gif ; rm ${i}  ; done
for i in `find .  -name "*.ICO"`; do j=`echo ${i} | sed 's/.ICO//g'` ; convert -quality 100 ${i} ${j}.gif ; rm ${i}  ; done
for i in `find .  -name "*.Ico"`; do j=`echo ${i} | sed 's/.Ico//g'` ; convert -quality 100 ${i} ${j}.gif ; rm ${i}  ; done
for i in `find .  -name "*.raw"`; do j=`echo ${i} | sed 's/.raw//g'` ; convert -quality 100 ${i} ${j}.gif ;rm ${i}  ; done
for i in `find .  -name "*.RAW"`; do j=`echo ${i} | sed 's/.RAW//g'` ; convert -quality 100 ${i} ${j}.gif ; rm ${i}  ; done
for i in `find .  -name "*.Raw"`; do j=`echo ${i} | sed 's/.Raw//g'` ; convert -quality 100 ${i} ${j}.gif ; rm ${i}  ; done
for i in `find .  -name "*.gif"`; do j=`echo ${i} | sed 's/.gif//g'` ; convert -quality 100 ${i} ${j}.png ; rm ${i}  ; done
for i in `find .  -name "*.GIF"`; do j=`echo ${i} | sed 's/.GIF//g'` ; convert -quality 100 ${i} ${j}.png ; rm ${i}  ; done
for i in `find .  -name "*.Gif"`; do j=`echo ${i} | sed 's/.Gif//g'` ; convert -quality 100 ${i} ${j}.png ; rm ${i}  ; done

a co varianty bMP bMp iCO iCo atd?
tohle je hroznej bastl, pouzij outer loop a case insensitive search ...

Honza1

Re:Nalezení a a konvert obrázků
« Odpověď #6 kdy: 24. 08. 2015, 15:46:21 »
V podstate spoleham na to ze tam nejsou (a nemeli by s nejvetsi pravdepodobnosti) stejne tak jako existuje mnoho dalsich formatu a typu, vypsal jsem ty nejpravdepodobnejsi. Jak to udelat insensitive case, to zatim nevim. Jak mas na mysi outer loop ?

heho

Re:Nalezení a a konvert obrázků
« Odpověď #7 kdy: 24. 08. 2015, 16:26:27 »
Používat for x in `somecommand` by se celkově nemělo, výjimkou jsou wildcardy (for x in *.txt) kde to nerozděluje podle mezer ale podle souborů a řetězce co si píšu sám, takže vím jak vypadaj. Nepoužívání mezer pomůže ale rozhodně to není správné řešení. Mimo jiné je místo `.....` lepší používat $(.....), což (už) je také v POSIXu a umožňuje to vnořování a je celkově přehlednější. Co se skriptu týče, udělal bych to nějak takhle:
Kód: [Vybrat]
#!/bin/bash
# pokud mám argument, je to jméno soubru na zkonvertování
if [ $# -ge 1 ];then
    # ${1%.*} usekne z prvního argumentu poslední tečku a cokoli za ní
    # koncovku neznám kvůli case insensitive hledání
    if convert "$1" "${1%.*}.png";then
        rm "$1"
        exit 0
    else
        exit 1
    fi
fi

exts="gif ico tiff bmp"
dest=.
threads=4

for x in $exts;do
    # -iname - case insensitive verze -name abych nemusel hledat všechny varianty
    # nejsem si jistej jestli to je stadartní, nebo fičura GNU findu
    find "$dest" -iname "*.$x" -print0 | xargs -0 -I{} -n1 -P$threads "$0" "{}"
    # tu se zavolám se jménem souboru jako argumentem
done

nobody

Re:Nalezení a konvert obrázků
« Odpověď #8 kdy: 24. 08. 2015, 21:01:17 »
jednim vrzem prohledavani vice pripon, pri nalezeni obrazek ihned prevadi a smaze ho jen pri uspesnem prevedeni:
Kód: [Vybrat]
find -regextype posix-extended -iregex '.*\.(bmp|gif|ico|pcx|raw|tif|tiff)' -exec sh -c 'convert -quality 100 ${1%} ${1%.*}.png && rm ${1}' _ {} \;

karel

Re:Nalezení a konvert obrázků
« Odpověď #9 kdy: 25. 08. 2015, 05:21:50 »
tak tak, silenost,
no nejprve je dobre sjednotit nazvy a nez delat key senzitiv match tak proste unifikovat koncovky treba na jen mala pismena
at zije rename

trubicoid2

Re:Nalezení a konvert obrázků
« Odpověď #10 kdy: 25. 08. 2015, 07:28:27 »
jen okrajova poznamka ke konverzi do png s -quality 100; to je IMHO blbost  :o

u png je v tom cisle zakodovana komprese a filtr, defaultni je 75 (komprese 7 a filtr 5 =adaptivni). Ze zkusenosti nejmensi soubory byvaji u -quality 95, naopak to vase zavadejici -quality 100 dava soubory dokonce vetsi nez je defaultni nastaveni (bud -quality 75 nebo uplne bez -quality).

http://www.imagemagick.org/script/command-line-options.php#quality

kdo by chtel jeste mensi png, tak muze jeste vysledek pochroustat v optimpng, advpng nebo v pngzopfli, kdyz uz se to tlaci pres nejaky skript

Honza1

Re:Nalezení a konvert obrázků
« Odpověď #11 kdy: 26. 08. 2015, 12:24:03 »
Jak psal nobody, takto je to nejlepsi reseni vubec. Nejdriv PNG prevedu na BMP a pak vse na PNG, pro min. velikost QUALITY 95


find -regextype posix-extended -iregex '.*\.(png|PNG|Png)' -exec sh -c 'convert ${1%} ${1%.*}.gif && rm ${1}' _ {} \;
find -regextype posix-extended -iregex '.*\.(bmp|BMP|Bmp|tif|TIF|Tif|tiff|TIFF|Tiff|pcx|PCX|Pcx|ico|ICO|Ico|raw|RAW|Raw|gif|GIF|Gif)' -exec sh -c 'convert -quality 95 ${1%} ${1%.*}.png && rm ${1}' _ {} \;

Slo by to nejak pouzit k rozbaleni archivu, ktere se nachazeji vsude mozne ? V adresari, kde je archiv, se utvori slozka s nazvem archivu (bez pripony) a do ni se archiv rozbali a pak smaze. tar.gz je zvlastni - rozbali se primo na miste, tar.gz se smaze a nasledne .tar rozbali.

trubicoid2

Re:Nalezení a konvert obrázků
« Odpověď #12 kdy: 26. 08. 2015, 13:58:40 »
jen nejak nechapu ten prvni prevod vsech png do gif, to je proc? tim se snizi pocet barev na 256, coz mozna nechces
a v druhem kroku zase ten gif se predela do png?

archivy myslis jake? zip, tar.*? tar vetsinou miva uz v sobe jeden adresar a v nem vse ostatni (zdrojaky to tak maj), zip to nemiva
libovolnej komprimovanej tar muzes najednou rozbalit v jednom kroku pomoci
Kód: [Vybrat]
tar xf tvujsoubor.tar.* sam si najde dekompresor na gz, bz2, xz a nevim co jeste

Honza1

Re:Nalezení a konvert obrázků
« Odpověď #13 kdy: 26. 08. 2015, 14:52:32 »
Prevod do gif prave pro snizeni 16 777 216 barev na paletu libovolnych 256 barev, 216 barev z RGB vybere rogram, muze to byt i 256 stupnu sedi. Nevhodne pro fotky a pod. samozrejme. A pri konvertu do gif nesmi byt zapla dihertace (coz je prokladani vzoru aby to melo jakoze vic barev)

Jakim prikazem rozbalit archov vim (7z x nebo 7za x a nazev archivu). Slozky v archovu jou ruzne a nevim jake dopredu. proto to vytvoreni adresare snazvem archivu bez pripony. Seznam pripon archovu resim stejne jako u obrazku. Obecne pocet archivu je mnohem nizsi nez pocet obrazku.

trubicoid2

Re:Nalezení a konvert obrázků
« Odpověď #14 kdy: 26. 08. 2015, 15:56:49 »
Prevod do gif prave pro snizeni 16 777 216 barev na paletu libovolnych 256 barev, 216 barev z RGB vybere rogram, muze to byt i 256 stupnu sedi. Nevhodne pro fotky a pod. samozrejme. A pri konvertu do gif nesmi byt zapla dihertace (coz je prokladani vzoru aby to melo jakoze vic barev)
toto jde resit jenom convertem z png do png, bez mezistupne v gif:
Kód: [Vybrat]
-depth 8 -type Palette
jinak na hromadny convert se ma pouzivat morgify, ze stejnyho balicku

Jakim prikazem rozbalit archov vim (7z x nebo 7za x a nazev archivu). Slozky v archovu jou ruzne a nevim jake dopredu. proto to vytvoreni adresare snazvem archivu bez pripony. Seznam pripon archovu resim stejne jako u obrazku. Obecne pocet archivu je mnohem nizsi nez pocet obrazku.

ja jen ze jsi chtel prvne dekomprimovat tar a pak az se zabyvat tim tarem, i kdyz to jde krasne jednim prikazem