Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: fotka 06. 11. 2014, 23:07:03

Název: Velká proměnná v bashi, jak to udělat lépe?
Přispěvatel: fotka 06. 11. 2014, 23:07:03
Ahoj,

mám bash skript a příkaz find jež je součástí "for" cyklu ,ůže naleznou třeba i desítky tisíc souborů, tak mě zajímá jestli je to možná takto použít pokud mám asi 6gb volné RAM a nepříliš rychlý disk na cachování.

Kód: [Vybrat]
for filepath in $(find /home ***);do
for phrasse in $(cat phrasses);do
grepout=$(grep ***)
if [[ "$grepout" == *"some phrasse"* ]];then
echo "phrasse found in $filepath"
fi
done
done
Název: Re:Hrozně velká proměnná bash skriptu, jak to udělat lépe?
Přispěvatel: fotka 06. 11. 2014, 23:07:59
$(find /home ***)  -- to je ta proměnná kde bude hodně výsledků
Název: Re:Hrozně velká proměnná bash skriptu, jak to udělat lépe?
Přispěvatel: Lol Phirae 06. 11. 2014, 23:16:45
for phrasse in $(cat phrasses);do

A saphra!  ;D
Název: Re:Hrozně velká proměnná bash skriptu, jak to udělat lépe?
Přispěvatel: perceptron 06. 11. 2014, 23:20:11
ano
Název: Re:Hrozně velká proměnná bash skriptu, jak to udělat lépe?
Přispěvatel: Franta <xkucf03/> 06. 11. 2014, 23:24:43
Nejde jen o to, že dat bude hodně. Problém je i v tom, jak zjistit, kde jeden název končí a jiný začíná – názvy můžou obsahovat mezery…

Lepší je nepoužívat cyklus a proměnné, ale zpracovat to proudově, předat přes rouru. Jak find, tak xargs umí hodnoty oddělené nulovým bajtem:

find auto/ -print0 | xargs -0 -L 1 echo
Název: Re:Hrozně velká proměnná bash skriptu, jak to udělat lépe?
Přispěvatel: Zopper 06. 11. 2014, 23:27:55
Jen hodně rychle orientačně: řekněme, že jeden znak má jeden bajt. Jeden soubor asi nebude mít v průměru delší cestu, než třicet znaků. Krát deset tisíc, to je něco ke 300 KiB. Kolik paměti sežere Bash?  ::)

Spíš bych se bál, jestli procesor rovnou nespáchá sebevraždu, pokud mu naservíruješ pár vnořených cyklů s desítkami tisíc iterací v každém.  8)
Název: Re:Hrozně velká proměnná bash skriptu, jak to udělat lépe?
Přispěvatel: Sadam 07. 11. 2014, 01:37:46
A nechces nam rict k cemu to chces pouzit ? proc mam pocit ze to chces pouzit na vyhledani fraze v X souborech ? (Kod jsem tak bez premysleni prejel ocima)

grep -R "find me" ./folder/lotofiles

ti nestaci ?
Název: Re:Hrozně velká proměnná bash skriptu, jak to udělat lépe?
Přispěvatel: Jenda 07. 11. 2014, 03:42:45
for phrasse in $(cat phrasses);do
grepout=$(grep ***)
if [[ "$grepout" == *"some phrasse"* ]];then
echo "phrasse found in $filepath"
fi
done
grep -E "(první|druhá|třetí)" je rychlejší. A pro ještě rychlejší hledání je tu http://ss64.com/bash/fgrep.html.
Název: Re:Hrozně velká proměnná bash skriptu, jak to udělat lépe?
Přispěvatel: _pepak 07. 11. 2014, 06:43:29
Doporučuju podívat se na grep -f a find -exec, v tomto pořadí.
Název: Re:Hrozně velká proměnná bash skriptu, jak to udělat lépe?
Přispěvatel: karel 07. 11. 2014, 11:42:52
mam dotaz neslo by aby fotka mel vlastni vlakno na forum.root.cz neco ve smyslu "hloupe a jeste hloupejsi dotazi administratora" nebo mozna ve zkratce "bastleni pro profiky aneb je nam jedno jak dlouho script pobezi a kolik vezme systemovych prostredku hlavne ze to ma spoustu radku a je co prezentovat"
Název: Re:Velká proměnná v bashi, jak to udělat lépe?
Přispěvatel: CyberBob 07. 11. 2014, 14:13:15
Vypise mena suborov, ktore obsahuju "search pattern":

find /home -exec grep -l "search pattern" {} \;
Název: Re:Velká proměnná v bashi, jak to udělat lépe?
Přispěvatel: # 07. 11. 2014, 17:48:26
Fotka uz svoje tema ma http://forum.root.cz/index.php?topic=9861.msg108336#msg108336 tak by si mel hrat tam chlapec, stejne nechapu proc se tady porad pta, kdyz navstevuje 15 dalsich linux for, asi se mu uz vsude jinde taky vysmali.
Název: Re:Velká proměnná v bashi, jak to udělat lépe?
Přispěvatel: fotka 22. 11. 2014, 12:27:10
děkuji za příklady příkazů, já ale potřebuji vyhledat asi 20 frází, které obsahují lomítka, oba druhy uvozovek, středníky a lomené závorky.. nevím jak bych to dal do těch Vašich grepů.. a find -execů
Název: Re:Velká proměnná v bashi, jak to udělat lépe?
Přispěvatel: hawran diskuse 22. 11. 2014, 14:20:01
děkuji za příklady příkazů, já ale potřebuji vyhledat asi 20 frází, které obsahují lomítka, oba druhy uvozovek, středníky a lomené závorky.. nevím jak bych to dal do těch Vašich grepů.. a find -execů

http://lmgtfy.com/?q=linux+man+fgrep
Název: Re:Velká proměnná v bashi, jak to udělat lépe?
Přispěvatel: fotka 22. 11. 2014, 21:50:22
Takže bych měl použít například find a jako hodnotu -exec dát: fgrep -f /soubor_s_vecmi_co_najit_v_souborech ?

a výsledek toho findu budou cesty k souborům které obsahují všechny ty věci co chci hledat? je to efektivní způsob?

(ten find má hodně parametrů, potřebuju ho, grep -Ril asi nemůžu použít protože chci grepovat jen určité soubory (malé, změněné nedávno, s určitou příponou apod..)
Název: Re:Velká proměnná v bashi, jak to udělat lépe?
Přispěvatel: hawran diskuse 23. 11. 2014, 14:25:16
Takže bych měl použít například find a jako hodnotu -exec dát: fgrep -f /soubor_s_vecmi_co_najit_v_souborech ?

a výsledek toho findu budou cesty k souborům které obsahují všechny ty věci co chci hledat? je to efektivní způsob?

(ten find má hodně parametrů, potřebuju ho, grep -Ril asi nemůžu použít protože chci grepovat jen určité soubory (malé, změněné nedávno, s určitou příponou apod..)
Přečetl sis nějaký ten man?
Zkusil's něco? Co to udělalo?

Pokud víš, že ty Tvoje patterny nebudou nějaké 'hi-fi' regulární výrazy, použij fgrep (grep -F ...), jinak ten egrep (grep -E ...).
https://www.google.cz/search?hl=cs&as_q=using+find+and+egrep (https://www.google.cz/search?hl=cs&as_q=using+find+and+egrep)

...
a výsledek toho findu budou cesty k souborům které obsahují všechny ty věci co chci hledat? je to efektivní způsob?
Co si představuješ pod pojmem efektivní v tomto případě?