Fórum Ubuntu CZ/SK

Ubuntu pro osobní počítače => Software => Příkazový řádek a programování pro GNU/Linux => Téma založeno: mr.p 04 Dubna 2013, 14:26:44

Název: Bash, vyhledání obrázků dle obsahu css souboru
Přispěvatel: mr.p 04 Dubna 2013, 14:26:44
Pěkný den přeji,

řeším následující problém:
Mám skupinu css souborů (ty jsou v jedné složce) a v nich používám obrázky třeba jako pozadí nebo ikony atd... klasický stylování designu webu. Ty obrázky jsou pak uloženy ve složce <nazev>_template/images. Kde název je název konkrétního templatu použitého na stránce. Problém je v tom, že jsem vždy zkopíroval složku <nazev>_template a pak jen upravil css a přepsal obsah obrázků, názvy zůstaly stejné, ale nechci mít v těch složkách obrázky navíc.

A protože používám linux napadlo mě celý problém vyřešit pekným bashem, který by prošel složky s obrazkama v jednotlivych templatech a srovnal by je s obsahem v těch css souborech a vypsal by, které obrázky tak nejsou obsažené v tom css. V linuxu se ještě nepohybuju tak dlouho a bash nemám nastudovaný.

Prosím o radu kam se mám podívat případně o nástin řešení, moc vám děkuji za reakce :)
Název: Re:Bash, vyhledání obrázků dle obsahu css souboru
Přispěvatel: ntz_reloaded 04 Dubna 2013, 16:13:32
tohle za tebe asi nikdo nenapise .. zacni, a v pripade ze budes mit problemy tak se normalne zeptej ..,

ja za sebe bych zrovna tohle (skoro jako vsechno ;)) delal v perlu ..

zdravim, ntz
Název: Re:Bash, vyhledání obrázků dle obsahu css souboru
Přispěvatel: mr.p 04 Dubna 2013, 20:15:22
Mno tak se do toho dáme, ale budu potřebovat vést trochu za ruku :)

Začneme z jednoducha: Jak mám procházet soubory ve složce pomocí cyklu?

btw. ten script si představuju nějak takhle:

Docela jednoduše to vypadá, že :) Teď ještě vědět jak to napsat...
Název: Re:Bash, vyhledání obrázků dle obsahu css souboru
Přispěvatel: mr.p 04 Dubna 2013, 21:00:48
Tak jsem napsal první část :D Předpokládám, že to budu spouštět ve složce templates.

Kód: [Vybrat]
for file in `find . -type d -name "*_template"`
do     
        file="${file%_template}"
        echo "Nasel jsem ${file:2}";
done

Malá otázka: find mi vrací na začátku ./ je možný to nějak odstranit společně s tim _template v jednom kroku?
Název: Re:Bash, vyhledání obrázků dle obsahu css souboru
Přispěvatel: ntz_reloaded 04 Dubna 2013, 22:25:48
pekny ;) .. treba pomoci `basename' .. neni to sice idealni, ale tvor a az to bude hotovy, tak se s tim pochlub a urcite se to jeste vylepsi
Název: Re:Bash, vyhledání obrázků dle obsahu css souboru
Přispěvatel: pacholik 04 Dubna 2013, 23:29:57
nebo říct findu aby vracel jenom jméno souboru
Kód: [Vybrat]
find . -type d -name "*_template" -printf "%f\n"
potom se mi to zdá docela jednoduchý
Kód: [Vybrat]
cd "$složka"
for i in *; do grep "$i" "$css" > /dev/null || echo $i; done
Název: Re:Bash, vyhledání obrázků dle obsahu css souboru
Přispěvatel: mr.p 04 Dubna 2013, 23:34:06
Takže dal jsem to dohromady :) Nakonec jsem ani nepotřeboval `basename`
Kód: [Vybrat]
#!/bin/bash

for dir in `find . -type d -name "*_template"`
do
  name=`expr "${dir}" : '..\([a-z]*\)'`

  for img in `find ${dir}/images -type f -regextype posix-extended -regex '^.*\.(png|jpg)'`
  do
    img=${img##*/}
    grp=`grep -l "$img" ${dir}/css/*${name}*.css`

    if [ -z "${grp}" ]; then
      echo ${dir}"/images/"${img}
    fi
  done
 
  echo # Pro zprehledneni
done

A kdyz to spustim na serveru tak dostanu nasledujici hlasku pokazdy kdyz se dostanu k tomu ifu, ale jen u nekterych radku
Kód: [Vybrat]
./script.sh: line 11: [: too many arguments
Edit, tak chyba byla v tom, že na serveru je jinak nastaveno chovani grepu. Takže jsem to opravil i v kodu
Název: Re:Bash, vyhledání obrázků dle obsahu css souboru
Přispěvatel: ntz_reloaded 05 Dubna 2013, 02:25:10
no, vzhledem k tomu, ze jsi ze zacatku prohlasoval ze (v shellu) programovat ****neumis, tak musim rict, ze jsi sikula ..
Název: Re:Bash, vyhledání obrázků dle obsahu css souboru
Přispěvatel: mr.p 05 Dubna 2013, 08:23:18
ntz_reloaded:
Ooo, děkuji :) Jen si nějako neuvědomuju, kde jsem prohlašoval, že budu programovat? :P

pacholik:
díky za ten find, rozšířil jsi mi ještě trocho obzor :) Je fakt, že takhle by to bylo napsany "čistějc", řekl bych, podobně jako s využitím basename.

Vysvětlil bys mi prosím ještě toto? Ty dvě svyslítka tušim jsou schopný nahradit ten if, ale dev/null jsem nepobral
Kód: [Vybrat]
> /dev/null || echo $i
Název: Re:Bash, vyhledání obrázků dle obsahu css souboru
Přispěvatel: pacholik 05 Dubna 2013, 12:59:41
Jj, svislítka nahradí if
Kód: [Vybrat]
[ 1 == 2 ] && echo "1 = 2" || echo "1 ≠ 2"Když grep nic nenajde tak skončí neúspěchem (a vykoná se tedy to za ||).

Kdyby tam nebylo to přesměrování tak se vypíše výstup z grepu (což nechceš). /dev/null je taková černá díra.
http://www.abclinuxu.cz/ucebnice/zaklady/prikazova-radka/standardni-vstup-a-vystup
Název: Re:Bash, vyhledání obrázků dle obsahu css souboru
Přispěvatel: ntz_reloaded 05 Dubna 2013, 13:14:37
vypadavaji mi slova .. sorry