Sida 1 av 1

Förhindra radbrytning

Postat: 13 feb 2009, 08:21
av dmz
Jag vill lista alla filer som innehåller ett eller flera blanksteg. Tänkte då så här:

Kod: Markera allt

for dir in `\ls|grep '\ '`; do echo $dir; done
Vilket inte ger mig så fin output eftersom det inte enbart är 2 eller färre ord separerade med ett blanksteg. Hur gör jag?

Re: Förhindra radbrytning

Postat: 13 feb 2009, 10:22
av Konservburk

Kod: Markera allt

for i in *\ *; do echo "$i"; done

Re: Förhindra radbrytning

Postat: 13 feb 2009, 11:38
av dmz
Konservburk skrev:

Kod: Markera allt

for i in *\ *; do echo "$i"; done
Varför fungerar det där, men inte

Kod: Markera allt

    for dir in `\ls|grep '\ '`; do echo "$dir"; done
?

Re: Förhindra radbrytning

Postat: 13 feb 2009, 15:48
av Konservburk
dmz skrev:Varför fungerar det där, men inte

Kod: Markera allt

    for dir in `\ls|grep '\ '`; do echo "$dir"; done
?
Resultatet av det inre kommandot blir en enda lång sträng som sedan delas upp enligt $IFS utan att skalet har den blekaste aning om vad de faktiska filnamnen egentligen är.

Re: Förhindra radbrytning

Postat: 13 feb 2009, 15:59
av dmz
Vad menar du med "enligt $IFS"?

Re: Förhindra radbrytning

Postat: 13 feb 2009, 16:08
av mcNisse
Input Field Separator

Re: Förhindra radbrytning

Postat: 13 feb 2009, 16:19
av Konservburk
Internal Field Separators

Kod: Markera allt

   Blank interpretation.
       After parameter and command substitution, any results  of  substitution
       are  scanned  for  internal  field separator characters (those found in
       $IFS) and split into  distinct  arguments  where  such  characters  are
       found.

Re: Förhindra radbrytning

Postat: 13 feb 2009, 16:24
av dmz
Tackar. :)

Re: Förhindra radbrytning

Postat: 13 feb 2009, 16:56
av Konservburk
Ska man vara riktigt petig så bör man se upp även med mitt förslag eftersom globben inte kommer att expandera ifall det inte finns några filnamn som innehåller mellanslag. Det som då händer är att for-loopen istället behåller själva globben, dvs "* *", och kör ett varv med den.

Re: Förhindra radbrytning

Postat: 13 feb 2009, 17:36
av dmz
Konservburk skrev:Ska man vara riktigt petig så bör man se upp även med mitt förslag eftersom globben inte kommer att expandera ifall det inte finns några filnamn som innehåller mellanslag. Det som då händer är att for-loopen istället behåller själva globben, dvs "* *", och kör ett varv med den.
Misstänker att du har någon snygg workaround?

Re: Förhindra radbrytning

Postat: 13 feb 2009, 19:00
av Konservburk
dmz skrev:
Konservburk skrev:Ska man vara riktigt petig så bör man se upp även med mitt förslag eftersom globben inte kommer att expandera ifall det inte finns några filnamn som innehåller mellanslag. Det som då händer är att for-loopen istället behåller själva globben, dvs "* *", och kör ett varv med den.
Misstänker att du har någon snygg workaround?
Det beror lite på vad du tänker göra. Du kan t.ex. testa så att loop-variabeln är ett filnamn som verkligen finns:

Kod: Markera allt

for i in *\ *; do if test -e "$i"; then echo "$i"; fi; done
Annars är find alltid ett bra alternativ:

Kod: Markera allt

find -maxdepth 1 -name '* *' -exec echo {} \;
Då kan du dessutom enkelt plocka bort -maxdepth 1 om du även vill få med underkataloger.