mezery ve jmene souboru a shell interpretace

Vancl Miroslav (QRIS) Miroslav.Vancl na qris.cz
Úterý Březen 4 10:41:59 CET 2008


Marian Cavojsky napsal:

> for je na toto naozaj nevhodne. Ak potrebujete pre kazdy subor spustit
> jeden prikaz pozrite si v xargs prepinace --replace a --max-args.
> 

Cyklus for tady je skutecne nepohodlny ale krkolomne se pouzit da nejak
takhle:

ifs="$IFS"
IFS=$'\n'
for i in `find . -name '* *'` ; do \ls -l "$i" ; done
IFS="$ifs"

Osobne bych radsi nez xargs pouzil cyklus while/read, protoze je
flexibilnejsi a zda se mi prehlednejsi:

find . -name '* *' | while read i ;do ls -l "$i" ; done

M. Vancl

P.S.
Netusite nekdo, proc mi nejde ve vyse uvedenem for cyklu pouzit ls ? Hlasi
mi to chybu "/bin/ls: invalid option --" a netusim proc. Urcite to nejak
bude souviset s IFS ale nevim jak (priznavam, ze dodnes netusim, kdy presne
se IFS uplatnuje, takze vzdycky musim experimentovat).

ls je alias za "/bin/ls $LS_OPTIONS" a LS_OPTIONS je "-a -N --color=tty -T
0"

P.P.S.

Uz to vim: Problem delaji ty mezery v LS_OPTIONS. Retezec se pred volanim
/bin/ls v shellu znovu interpretuje s pozmenenym IFS a jednotlive optiony se
chybne slepi do jednoho argumentu pro ls a ten si s tim nevi rady. Zvlastni
je pro mne to, ze ty mezery v napsanem prikazu se jako oddelovac
interpretuji zrejme jeste pred zmenou IFS. 
Takze to jde i s pouzitim aliasu napsat takhle:

ifs="$IFS"
IFS=$'\n'
for i in `find . -name '* *'` ; do 
  IFS="$ifs"
  ls -l "$i" ; done
IFS="$ifs"

howgh



Další informace o konferenci Linux