Pomoc s napsáním podmínky

Matěj

Pomoc s napsáním podmínky
« kdy: 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.


Franta <xkucf03/>

Re:Pomoc s napsáním podmínky
« Odpověď #1 kdy: 26. 11. 2017, 15:43:54 »
Příkaz:
Kód: [Vybrat]
find -mindepth 1 -maxdepth 1 -type d | wc -lti 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.

petr

Re:Pomoc s napsáním podmínky
« Odpověď #2 kdy: 26. 11. 2017, 16:47:31 »
Nepotřebujete spíše pomoc s napsáním dotazu? Já ten Váš nejsem schopen pochopit.

nu

Re:Pomoc s napsáním podmínky
« Odpověď #3 kdy: 26. 11. 2017, 16:56:51 »
Pošlu Vám podmínku pro adresář, ve kterém ji spustíte. Pro ten Váš si můžete upravit.
Kód: [Vybrat]
if [ $(ls -alF | grep -v  '[[:space:]]\.\{1,2\}\/$' | grep -c ^d) = "0" ]
then
echo "No directory!"
else
echo "Some dirs exists!"
fi

nu

Re:Pomoc s napsáním podmínky
« Odpověď #4 kdy: 26. 11. 2017, 16:58:34 »
Ale jinak by bylo stejně jednodušší použít -d a potřebnou část programu napsat do bloku else.


nu

Re:Pomoc s napsáním podmínky
« Odpověď #5 kdy: 26. 11. 2017, 17:11:13 »
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.

standa12345

Re:Pomoc s napsáním podmínky
« Odpověď #6 kdy: 28. 11. 2017, 01:15:41 »
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

nu

Re:Pomoc s napsáním podmínky
« Odpověď #7 kdy: 28. 11. 2017, 20:22:58 »
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í...

martin

Re:Pomoc s napsáním podmínky
« Odpověď #8 kdy: 29. 11. 2017, 11:03:33 »
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
Kód: [Vybrat]
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

Inkvizitor

Re:Pomoc s napsáním podmínky
« Odpověď #9 kdy: 29. 11. 2017, 12:45:57 »
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
Kód: [Vybrat]
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.

nu

Re:Pomoc s napsáním podmínky
« Odpověď #10 kdy: 29. 11. 2017, 18:29:42 »
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
Kód: [Vybrat]
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..

j

Re:Pomoc s napsáním podmínky
« Odpověď #11 kdy: 29. 11. 2017, 19:48:55 »
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.

martin

Re:Pomoc s napsáním podmínky
« Odpověď #12 kdy: 29. 11. 2017, 22:34:29 »
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
Kód: [Vybrat]
#!/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
Kód: [Vybrat]
$ time ./zk1.sh
Dirs

real    0m0,016s
user    0m0,013s
sys     0m0,002s

zk2.sh
Kód: [Vybrat]
#!/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
Kód: [Vybrat]
$ time ./zk2.sh
Dirs                                       

real    0m0,432s                           
user    0m0,399s                           
sys     0m0,390s

Takze jsi uplne vedle.