Portál AbcLinuxu, 10. května 2025 03:04

Dotaz: for cyklus, find, mezera ve jmenu souboru

31.8.2007 12:39 janx
for cyklus, find, mezera ve jmenu souboru
Přečteno: 1643×
Odpovědět | Admin
Kdyz se vyskytne ve jmenu souboru, tak v $i mam dve casti

priklad: jmeno souboru: /pdf/profile/profile_rts test.pdf

for i in `find ./ -type f -name '*'`; do echo " -- $i"; done

vystup:

-- ./adb/files/pdf/profile/profile_rts -- test.pdf

Nesetkal jste se s timto nekdo? Je nejake jednoduche reseni v bashi?

Diky Honza

ps: bash --version GNU bash, version 3.2.17(1)-release (i686-pc-linux-gnu)
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

31.8.2007 12:59 Filip Jirsák | skóre: 68 | blog: Fa & Bi
Rozbalit Rozbalit vše Re: for cyklus, find, mezera ve jmenu souboru
Odpovědět | | Sbalit | Link | Blokovat | Admin
Je to normální chování příkazu for, který seznam parametrů dělí podle bílých znaků. jednoduché řešení je nepoužívat for a find dohromady pro něco, co umí sám find:
find ./ -type f -name '*' -exec echo " -- " "{}" \;
\; (středník jako parametr, backslash jej uvozuje aby jej neinterpertoval shell) ukončuje spouštěný příkaz, místo {} se postupně dosadí jména nalezených souborů.
31.8.2007 13:48 janx
Rozbalit Rozbalit vše Re: for cyklus, find, mezera ve jmenu souboru
a kdyz to pouzivam v tomto kontextu? Asi lepsi uz udelat skript,co?

for i in `find ./ -type f -name '*.java'`; do echo $i; awk '{if(tolower($0) ~ /select/) print NR " : " $0}' $i | sort -n; done
31.8.2007 14:15 Filip Jirsák | skóre: 68 | blog: Fa & Bi
Rozbalit Rozbalit vše Re: for cyklus, find, mezera ve jmenu souboru
find ./ -type f -name '*.java' -exec echo {} \; awk '{if(tolower($0) ~ /select/) print NR " : " $0}' {} \; | sort -n
31.8.2007 14:33 janx
Rozbalit Rozbalit vše Re: for cyklus, find, mezera ve jmenu souboru
chyba:

find: paths must precede expression: awk

31.8.2007 15:06 Filip Jirsák | skóre: 68 | blog: Fa & Bi
Rozbalit Rozbalit vše Re: for cyklus, find, mezera ve jmenu souboru
Vypadl mi tam jeden -exec
find ./ -type f -name '*.java' -exec echo {} \; -exec awk '{if(tolower($0) ~ /select/) print NR " : " $0}' {} \; | sort -n
4.9.2007 12:26 janx
Rozbalit Rozbalit vše Re: for cyklus, find, mezera ve jmenu souboru
Diky diky. To jsem nevedel, ze jde exec pouzit vicenasobne. Bezva diky

Honza
4.9.2007 15:32 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: for cyklus, find, mezera ve jmenu souboru
Jenom musíte dát pozor na to, že i -exec se chová jako podmínka: splněná, pokud příkaz vrátí nulu. Takže pokud první spouštěný příkaz skončí chybou, druhý už se neprovede.
Josef Kufner avatar 31.8.2007 13:43 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: for cyklus, find, mezera ve jmenu souboru
Odpovědět | | Sbalit | Link | Blokovat | Admin
find ... \
| while read filename
  do
      echo $filename
      ...
  done
Hello world ! Segmentation fault (core dumped)
31.8.2007 14:35 Martin Doucha | skóre: 23 | blog: Yet another blog
Rozbalit Rozbalit vše Re: for cyklus, find, mezera ve jmenu souboru
Odpovědět | | Sbalit | Link | Blokovat | Admin
IFS=`echo` váš problém vyřeší. IFS je proměnná, která obsahuje seznam oddělovačů slov. Pokud není nastavená, BASH bere jako oddělovače všechny bílé znaky (mezera, tabulátor, konec řádku...). Příkaz echo bez parametrů pouze odřádkuje, tedy ten příkaz nastaví jako oddělovač jen konec řádku. Pokud to chcete používat v interaktivním terminálu nebo sourcovaném skriptu, tak nakonec ještě pro jistotu udělejte unset IFS, aby to pak nedělalo neplechu jinde.
31.8.2007 14:50 janx
Rozbalit Rozbalit vše Re: for cyklus, find, mezera ve jmenu souboru
Ja vedel, ze to ma nějake "jednoduche" reseni. Ale o promenne IFS jsem nikdy neslysel. Kazdopadne to ted funguje jak ma.

Diky diky!

H.
31.8.2007 14:55 ams
Rozbalit Rozbalit vše Re: for cyklus, find, mezera ve jmenu souboru
Odpovědět | | Sbalit | Link | Blokovat | Admin
grep -Rni select *.java
4.9.2007 16:09 Ondra
Rozbalit Rozbalit vše Re: for cyklus, find, mezera ve jmenu souboru
Odpovědět | | Sbalit | Link | Blokovat | Admin
for i in ./*; do
   echo " -- $i"
done
4.9.2007 17:17 Martin Doucha | skóre: 23 | blog: Yet another blog
Rozbalit Rozbalit vše Re: for cyklus, find, mezera ve jmenu souboru
find při hledání prohledává celou adresářovou strukturu, ne jen aktuální adresář jako váš návrh. Navíc narozdíl od tazatele nerozlišujete soubory a adresáře.
4.9.2007 17:36 Ondra
Rozbalit Rozbalit vše Re: for cyklus, find, mezera ve jmenu souboru
To sice jo, ale kdo vi, co vlastne potrebuje...
4.9.2007 19:18 Filip Jirsák | skóre: 68 | blog: Fa & Bi
Rozbalit Rozbalit vše Re: for cyklus, find, mezera ve jmenu souboru
To sice jo, ale kdo vi, co vlastne potrebuje...
Tazatel to .
4.9.2007 20:28 Ondra
Rozbalit Rozbalit vše Re: for cyklus, find, mezera ve jmenu souboru
Ok;-). Tak to pardon.

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.