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
-
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 :)
-
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
-
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:
- budu procházet složku templates a hledat složky odpovídající patternu <nazev>_template
- ten <nazev> uložím do proměnné
- budu procházet <nazev>_template/images a každej název obrázku grepnu, zda se vyskytuje v některém z css souborů odpovídající patternu .*<nazev>.*.css
- pokud se v tom css nevyskytuje grep by mi měl dát prázdný výsledek, takže si obrázek i s cestou k němu nechám vypsat na obrazovku
Docela jednoduše to vypadá, že :) Teď ještě vědět jak to napsat...
-
Tak jsem napsal první část :D Předpokládám, že to budu spouštět ve složce templates.
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?
-
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
-
nebo říct findu aby vracel jenom jméno souboru
find . -type d -name "*_template" -printf "%f\n"
potom se mi to zdá docela jednoduchý
cd "$složka"
for i in *; do grep "$i" "$css" > /dev/null || echo $i; done
-
Takže dal jsem to dohromady :) Nakonec jsem ani nepotřeboval `basename`
#!/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
./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
-
no, vzhledem k tomu, ze jsi ze zacatku prohlasoval ze (v shellu) programovat ****neumis, tak musim rict, ze jsi sikula ..
-
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
> /dev/null || echo $i
-
Jj, svislítka nahradí if
[ 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
-
vypadavaji mi slova .. sorry