Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: Matěj 26. 11. 2017, 15:02:46
-
Zdravím,
může mi prosím někdo pomoci napsat podmínku v bash? Potřebuji aby se podmínka splnila, pokud v adresáři /var/www neexistuje pouze jediná položka a to adresář. Moc děkuji pokud by někdo pomohl.
-
Příkaz:
find -mindepth 1 -maxdepth 1 -type d | wc -l
ti vrátí počet adresářů. Když vynecháš -type d, tak ti to vrátí počet adresářů i dalších souborů. Z toho si to můžeš složit – čísla porovnáš s 1 a mezi sebou.
-
Nepotřebujete spíše pomoc s napsáním dotazu? Já ten Váš nejsem schopen pochopit.
-
Pošlu Vám podmínku pro adresář, ve kterém ji spustíte. Pro ten Váš si můžete upravit.
if [ $(ls -alF | grep -v '[[:space:]]\.\{1,2\}\/$' | grep -c ^d) = "0" ]
then
echo "No directory!"
else
echo "Some dirs exists!"
fi
-
Ale jinak by bylo stejně jednodušší použít -d a potřebnou část programu napsat do bloku else.
-
Ale jinak by bylo stejně jednodušší použít -d a potřebnou část programu napsat do bloku else.
Tak asi kecám, s tím -d mi to nějak nejde zprovoznit.
-
základ:
ls -1F /var/www | grep -q "/$"
pokud existuje adresář, tak je RC 0, jinak >0
V ifu pak sekce:
ls -1F /var/www | grep -q "/$"
# bezprostredne nasledovane ifem
if [ $? -ne 0 ]; then
echo "adresar NEexistuje"
fi
nebo:
if ls -1F /var/www | grep -q "/$"; then
echo "adresar existuje"
else
echo "adresar NEexistuje"
fi
-
základ:
ls -1F /var/www | grep -q "/$"
pokud existuje adresář, tak je RC 0, jinak >0
V ifu pak sekce:
ls -1F /var/www | grep -q "/$"
# bezprostredne nasledovane ifem
if [ $? -ne 0 ]; then
echo "adresar NEexistuje"
fi
nebo:
if ls -1F /var/www | grep -q "/$"; then
echo "adresar existuje"
else
echo "adresar NEexistuje"
fi
Jen to má drobnou vadu, nenajde to skryté adresáře. Ale jinak pěkné zjednodušení...
-
Vzdycky kdyz vidim veci jako ls | grep tak se mi otaci oci vsloup. V 90% to neni potreba, zbytecne se nekolikrat vola fork a exec, zpusobi to plno zbytecnych cpu wakeups, a je to pomaly.
co treba neco jako
found=0; for i in /var/www/*; do [ -d "$i" ] && { found=1; break; }; done
if [ "$found" = 1 ]; then echo "Dirs"; else echo "No dirs"; fi
-
Vzdycky kdyz vidim veci jako ls | grep tak se mi otaci oci vsloup. V 90% to neni potreba, zbytecne se nekolikrat vola fork a exec, zpusobi to plno zbytecnych cpu wakeups, a je to pomaly.
co treba neco jako
found=0; for i in /var/www/*; do [ -d "$i" ] && { found=1; break; }; done
if [ "$found" = 1 ]; then echo "Dirs"; else echo "No dirs"; fi
Jeste bych to prohnal profilerem, jestli neni mozno usetrit nekde par dalsich mikrosekund.
-
Vzdycky kdyz vidim veci jako ls | grep tak se mi otaci oci vsloup. V 90% to neni potreba, zbytecne se nekolikrat vola fork a exec, zpusobi to plno zbytecnych cpu wakeups, a je to pomaly.
co treba neco jako
found=0; for i in /var/www/*; do [ -d "$i" ] && { found=1; break; }; done
if [ "$found" = 1 ]; then echo "Dirs"; else echo "No dirs"; fi
Díky, takhle jsem se na ten problém nedíval. Já si to vždycky nadatluju tak, ať mi vypadne výsledek..
-
Vzdycky kdyz vidim veci jako ls | grep tak se mi otaci oci vsloup. V 90% to neni potreba, zbytecne se nekolikrat vola fork a exec, zpusobi to plno zbytecnych cpu wakeups, a je to pomaly....
Vetsinou je to pro danej ucel uplne jedno. V tuxovi existuje prevazne nejmin 30 dalsich zpusobu jak to udelat, a ten efektivni je v 99% takovej, kterej zvladne dotycnej nejrychlejs napsat. Kdyby mel pokazdy zkoumat, jestli to nejde udelat lip a vykonejs, tak na kazdy pitomosti stravi hodiny casu.
A psat na tohle smycku ... megalol ... to bude tak o 2 rady pomalejsi.
-
Vetsinou je to pro danej ucel uplne jedno. V tuxovi existuje prevazne nejmin 30 dalsich zpusobu jak to udelat, a ten efektivni je v 99% takovej, kterej zvladne dotycnej nejrychlejs napsat. Kdyby mel pokazdy zkoumat, jestli to nejde udelat lip a vykonejs, tak na kazdy pitomosti stravi hodiny casu.
A psat na tohle smycku ... megalol ... to bude tak o 2 rady pomalejsi.
Ne, je to o navycich. Staci se naucit co a jak jde udelat primo v shellu bez volani externich utilit a v delsim skriptu je to sakra znat. Nebo pri volani ve smycce.
K tomu o 2 rady pomalejsi...
zk1.sh
#!/bin/bash
count=0
while [ "$count" -lt 500 ]; do
((count++))
found=0; for i in /var/www/*; do [ -d "$i" ] && { found=1; break; }; done
done
if [ "$found" = 1 ]; then echo "Dirs"; else echo "No dirs"; fi
$ time ./zk1.sh
Dirs
real 0m0,016s
user 0m0,013s
sys 0m0,002s
zk2.sh
#!/bin/bash
count=0
while [ "$count" -lt 500 ]; do
((count++))
found=0; ls -1F /var/www | grep -q "/$" && found=1
done
if [ "$found" = 1 ]; then echo "Dirs"; else echo "No dirs"; fi
$ time ./zk2.sh
Dirs
real 0m0,432s
user 0m0,399s
sys 0m0,390s
Takze jsi uplne vedle.