[pytanie] [bash] pewien problem...

Dodano 01 KWI 2007 roku o godzinie 22:56:45

Mam problem z napisaniem pewnego skryptu w Bashu. Generalnie sprawę nieco uproszczę, bo póki co nie chcę wyjawiać co to będzie.

Zależy mi na tym, aby skrypt listował zawartość katalogu i przeprowadzał pewne działania na plikach. Problem polega na tym, że spacje w nazwach plików powodują totalny burdel. Próbowałem jakoś temu zaradzić, ale efekt jest raczej mizerny...

for x in `ls $1|sed 's/[ ]/\\ /g'|sed 's/\[/\\[/g'|sed 's/\]/\\]/g'`
do
        echo "$x"
done

Efekt skryptu, jest mniej więcej taki:

blah.txt
lol
massChmod.sh
test
Within
Temptation
-
The
Silent
Force
[2004]

Jak widać katalog o nazwie "Within Temptation - The Silent Force [2004]" został totalnie "rozłożony"...

Może ktoś wie jak temu zaradzić ?

Edit: poniższy kod będzie najlepszym przykładem tego jak ten skrypt się sypie...

#!/bin/bash
#

ls | while read x
do
        echo "$x"
        
        if [ -d "$x" ]
        then
                echo "=== Listuje pliki dla katalogu $x"
                ls -al $x
                echo "==="
        fi
done

Komentarze

#1

for x in „`ls $1|sed ‘s/[ ]/\\ /g’|sed ‘s/\[/\\[/g’|sed ‘s/\]/\\]/g’`”
do echo „$x”
done

(cudzysłowy dodałem, zdaje się u mnie działać ok – ale tak właściwie to do końca nie rozumiem dlaczego tak, bo chyba z tego że inaczej są interpretowane stringi, a inaczej goły tekst…)

Dex | #

#2

Dex, owszem wyświetli się poprawnie, ale spróbuj teraz np. dokonać jakiejś operacji na zmienne $x. Okaże się, że to jest jeden duży string, który nie pozowli na jakąkolwiek operację na plikach…

radmen | #

#3

Faktycznie… Wiec spróbuj tak:

ls $1 | while read x
do echo „$x”
done

Chyba o takie coś Ci chodzi…

Dex | #

#4

nah, niestety cały czas ten sam efekt…

radmen | #

#5

To już SOA#1 niestety tylko mogę dorzucić... ;)

Dex | #

#6

Hehehe nie wątpię :D

radmen | #

#7

for file in $1/*
do echo „$file” file „$file”
done

# have fun :)

fooshmer | #

#8

radmen:

Przy tym co dodałeś przy edytowaniu wpisu: ls -al $x -> wstawiłem $x w cudzysłowy i zadziałało ;)

Dex | #

#9

hmm ok, te przykłady są już ok ;-]

Ale jest jeszcze jeden problem. Mianowicie chcę aby skrypt o podobnej zasadzie był rekursywny (tzn, żeby zagłębiał się coraz bardziej w katalogi), no i te sposoby jakoś nie sprawdzają się w tym ;/

radmen | #

#10

Więc może zamiast ls warto użyć find do listowania plików? bez problemów wydrukuje same pliki, ze wszystkich podkatalogów, z jakimś kryterium filtrowania, itp. A rekurencja w Bashu IMHO to raczej zły pomysł jest (nowy, osobny proces na każdy poziom rekurencji), no ale… powinno się jakoś dać ;)

Dex | #

#11

faktycznie, to jest właśnie to co szukałem :)

Edit: dzięki :)

radmen | #

#12

troszkę to skomplikowane… :)

Ewela | #

Disclaimer

Jakkolwiek jestem właścicielem tego bloga, nie ponoszę odpowiedzialności za kometarze napisane przez innych obywateli tego wolnego kraju.

Zastrzegam sobie prawo do kasowania/modyfikowania komentarzy (jeśli uznam to za stosowne).

Dodaj komentarz

code