Portál AbcLinuxu, 10. května 2025 07:37

Dotaz: Jednoduchy hledac, ktery ale efunguje

14.7.2008 11:42 drtic_cz | skóre: 5 | blog: drtic
Jednoduchy hledac, ktery ale efunguje
Přečteno: 732×
Odpovědět | Admin
Zdravim, mam opet sriptovaci dodaz - delam tadu tuhle zver, abych mohl zjistit, ktere podadresare adresare "stroom" neobsahuji soubory s priponout mp3 . Tenhle me napadl, jakor prvni, lec na vystupu vypisuje prave uplne vsechny podadresarene, dokonce i kdyz dam echo $mp3 misto echo$i nakonec....

for i in "`ls //f/strom`"; do mp3=`ls //f/strom/"$i" |grep -c mp3` if [ "$mp3" == "0" ] then echo "$i" fi; done

Tusi nekdo, kde se deje chyba? (Mozna je to zbytecne slozity, ale stejne me zajima, kde jsem udelal chybu... Diky! Spoustim to pod win-bashem, proto ty divne cesty, nicmene stejne se to chova i na linuxu s linuxovymi cestami...
Arch Linux!
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Viliam Púčik avatar 14.7.2008 12:20 Viliam Púčik | skóre: 22 | blog: minimal
Rozbalit Rozbalit vše Re: Jednoduchy hledac, ktery ale efunguje
Odpovědět | | Sbalit | Link | Blokovat | Admin
Mozno zafunguje toto:
for i in $(ls //f/strom); do mp3=$(ls //f/strom/"${i}" |grep -c mp3); if [ "$mp3" == "0" ]; then echo "$i"; fi; done
14.7.2008 14:06 drtic_cz | skóre: 5 | blog: drtic
Rozbalit Rozbalit vše Re: Jednoduchy hledac, ktery ale efunguje
To same, jako puvodni. Problem je v tom, ze puvodne i muj script se choval stejne, jako tenhle - nedokaze ale vylistovat napr. adresar, ktery ma v nazvu mezeru. Proto jsem dal puvodni promennou do uvozovek a to zrejme zpusobilo, ze ji nejakym zpusobem spatne interpretuje. Jenze nemuzu prijit na to, kde je chyba :(
Arch Linux!
Viliam Púčik avatar 14.7.2008 15:56 Viliam Púčik | skóre: 22 | blog: minimal
Rozbalit Rozbalit vše Re: Jednoduchy hledac, ktery ale efunguje
Chyba v povodnom skripte je hned na zaciatku, do premennej i sa nevkladaju cele nazvy adresarov, len ich casti oddelene medzerami :-(, toto by to hadam pomohlo:
ls -1 //f/strom | while read adresar; do mp3=$(ls //f/strom/"${adresar}" | grep -c mp3); if [ "$mp3" == "0" ]; then echo ${adresar}; fi done
14.7.2008 12:30 Jan Šimák | skóre: 37 | Hradec Králové
Rozbalit Rozbalit vše Re: Jednoduchy hledac, ktery ale efunguje
Odpovědět | | Sbalit | Link | Blokovat | Admin
Já bych podadresáře hledal takto:
for i in `find /f/strom/ \! -name '*.mp3'`; do
	echo ${i%/*}
done
14.7.2008 13:36 Jan Šimák | skóre: 37 | Hradec Králové
Rozbalit Rozbalit vše Re: Jednoduchy hledac, ktery ale efunguje
toto je blbost, prosím ignorovat
14.7.2008 14:02 drtic_cz | skóre: 5 | blog: drtic
Rozbalit Rozbalit vše Re: Jednoduchy hledac, ktery ale efunguje
no, to mi nefunguje vubec, a navic se mi to zrovnatak nezda...
Arch Linux!
14.7.2008 15:30 chochi | skóre: 29 | Praha
Rozbalit Rozbalit vše Re: Jednoduchy hledac, ktery ale efunguje
Odpovědět | | Sbalit | Link | Blokovat | Admin
Problem v tvym vyrazu je, ze kdykoliv neco prevedes na standartni vystup, tak se strati informace o "mezerach v textu" a jsou z toho oddelovace. Proto bych zkusil misto ls normalni hvezdickovou konvenci (oprava tvyho vyrazu):
for i in //f/strom/*; do mp3=`ls "$i" |grep -c mp3`; if [ "$mp3" == "0" ]; then echo "$i"; fi; done
Nebo dalsi varianta (takhle bych to napsal asi ja):
for i in //f/strom/*; do (cd "$i"; ls *.mp3 1>/dev/null 2>&1 || echo "$i"); done
14.7.2008 15:57 drtic_cz | skóre: 5 | blog: drtic
Rozbalit Rozbalit vše Re: Jednoduchy hledac, ktery ale efunguje
Jo, to s hvezdickou me napadlo taky, ale zkus si dat echo $i - porad to dokola to prirazuje za i "//f/strom/*" :)
Arch Linux!
14.7.2008 16:25 chochi | skóre: 29 | Praha
Rozbalit Rozbalit vše Re: Jednoduchy hledac, ktery ale efunguje
To
//f/strom/*
nesmi byt v uvozovkach. Dalsi moznost je ze adresar //f/strom/ je prazdny (pak to nahradi puvodnim vyrazem - //f/strom/*). Jinak kdyz to zkusim:
chocholj@cz995891 ~ $ ls -R ~/tmp/b1 -w 1
/home/chocholj/tmp/b1:
a b
c d
e f g

/home/chocholj/tmp/b1/a b:
q w.mp3

/home/chocholj/tmp/b1/c d:

/home/chocholj/tmp/b1/e f g:
chocholj@cz995891 ~ $  for i in ~/tmp/b1/*; do mp3=`ls "$i" |grep -c mp3`; if [ "$mp3" == "0" ]; then echo "$i"; fi; done
/home/chocholj/tmp/b1/c d
/home/chocholj/tmp/b1/e f g
Tak se to chava snad podle ocekavani.
15.7.2008 16:28 drtic_cz | skóre: 5 | blog: drtic
Rozbalit Rozbalit vše Re: Jednoduchy hledac, ktery ale efunguje
V uvozovkach nebyl, jen jsem mu spatne interpretoval cestu...z nejakyho duvodu bash pod win nerozeznava nektere absolutni cesty, kdyz ma pracovni adresar na jinem disku... Kazdopadne moc diky - VYRESENO :)
Arch Linux!
14.7.2008 15:30 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: Jednoduchy hledac, ktery ale efunguje
Odpovědět | | Sbalit | Link | Blokovat | Admin
Tento skriptík
#!/usr/bin/python
import os
for root, dirs, files in os.walk('.'):
    for filename in files:
        if filename.lower().endswith('.mp3'):
            break
    else:
        print root
  1. správně zachází s cestami, i když obsahují mezery, diakritiku, čárky, dolary atd.
  2. běží rychleji než find + xargs + zpracování v shellu
  3. poběží beze změny kódu na linuxu stejně jako na windows
  4. názvy adresářů netestuje, tj. nenechá se zblbnout, jestliže _adresář_ obsahuje koncovku mp3
  5. pracuje rekurzivně (což možná nechceš)
14.7.2008 21:16 Deleted [8409] | skóre: 14 | blog: darkblog
Rozbalit Rozbalit vše Re: Jednoduchy hledac, ktery ale efunguje
Souhlas, pokud nebude chtit, aby to jelo rekurzivne, tak staci misto walk pouzit listdir. Takze no problem ;-)
22.7.2008 15:20 drtic_cz | skóre: 5 | blog: drtic
Rozbalit Rozbalit vše Re: Jednoduchy hledac, ktery ale efunguje
Python je urcite super, bohuzel ho neovladam :( Mozna casem .-)
Arch Linux!
14.7.2008 15:36 Semo | skóre: 45 | blog: Semo
Rozbalit Rozbalit vše Re: Jednoduchy hledac, ktery ale efunguje
Odpovědět | | Sbalit | Link | Blokovat | Admin
Vypisem si kazdy adresar a adresar kazdeho mp3 suboru. Adresar, ktory sa v zjednoteni tych dvoch vypisov objavi prave raz neobsahuje ziadnu mp3-ku.

Ak je problem, ze to pracuje rekurzivne, tak obom findom treba pridat switch -maxdepth 1
( find -type d ; find | sed -n '/\.mp3$/s;/[^/]*$;;p' ) | sort | uniq -c | grep '^[[:space:]]*1 '
If you hold a Unix shell up to your ear, you can you hear the C.
22.7.2008 15:44 drtic_cz | skóre: 5 | blog: drtic
Rozbalit Rozbalit vše Re: Jednoduchy hledac, ktery ale efunguje
Odpovědět | | Sbalit | Link | Blokovat | Admin
Tak vypis se udelat podarilo, mam soubor se seznamem adresaru. Ted jsem se k tomu vratil a potrebuju v nich dopocitat mp3.. Problemem zrejme bude verze Bashe, kterou jsem nesehnal pod windows vyssi, nez 2.03. Takze: cd //f for i in `cat missing.txt`; do for m in ls `ls $i`; do echo $m; done; done Muzu takhle zaloopovat dve for do sebe? Pac mi to vypisuje ": No such file or directory"... Kdyz misto `ls $i` dam $i/*, nahradi to prvni dva znaky v ceste "/*" ...je to nejaka vlastnost starsiho bashe, musi se na nej jinak?
Arch Linux!
22.7.2008 18:45 Ash | skóre: 53
Rozbalit Rozbalit vše Re: Jednoduchy hledac, ktery ale efunguje
Zkuste
cd /f
<missing.txt while read dirname; do
  echo "dirname: $dirname"
  for filename in `ls $dirname`; do
    echo "filename: $filename";
  done;
done
a pro blok textu používejte značku pre i když ten code láká víc.
23.7.2008 18:06 drtic_cz | skóre: 5 | blog: drtic
Rozbalit Rozbalit vše Re: Jednoduchy hledac, ktery ale efunguje
syntax error :/ asi se naucim scriptovat v perlu...
Arch Linux!
Tarmaq avatar 23.7.2008 18:21 Tarmaq | skóre: 39
Rozbalit Rozbalit vše Re: Jednoduchy hledac, ktery ale efunguje
v perlu ci v bashi?
Don't panic!
24.7.2008 16:43 drtic_cz | skóre: 5 | blog: drtic
Rozbalit Rozbalit vše Re: Jednoduchy hledac, ktery ale efunguje
Odpovědět | | Sbalit | Link | Blokovat | Admin
Vyreseno. Pripojil jsem windowsi partitionu k linuxovemu stroji a scriptiky bezi bez problemu tam. Problem byl proste ve windowsi implementaci bashe, kde se proste nektere prikazy nevykonavaly, jak mely.... :/
Arch Linux!
Tarmaq avatar 24.7.2008 17:08 Tarmaq | skóre: 39
Rozbalit Rozbalit vše Re: Jednoduchy hledac, ktery ale efunguje
btw co myslis tim win-bash ? nejakej cygwin ci co?
Don't panic!
24.7.2008 20:55 Semo | skóre: 45 | blog: Semo
Rozbalit Rozbalit vše Re: Jednoduchy hledac, ktery ale efunguje
Nie. Bash z MSYSu, problem je, ze je vo verzii 2.x a nie 3.x ako je uz roky na Linuxe. Takze nefunguje napr porovnanie =~ v [[ ]] a niektore dalsie ficury z 3.x.
If you hold a Unix shell up to your ear, you can you hear the C.
2.8.2008 19:16 drtic_cz | skóre: 5 | blog: drtic
Rozbalit Rozbalit vše Re: Jednoduchy hledac, ktery ale efunguje
Presne tak... http://www.steve.org.uk/Software/bash/
Arch Linux!

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.