[pytanie] [bash] pewien problem…

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

12 Responses to “[pytanie] [bash] pewien problem…”

  1. Dex April 1, 2007 at 10:56 pm #

    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…)

  2. radmen April 1, 2007 at 10:56 pm #

    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…

  3. Dex April 1, 2007 at 10:56 pm #

    Faktycznie… Wiec spróbuj tak:

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

    Chyba o takie coś Ci chodzi…

  4. radmen April 1, 2007 at 10:56 pm #

    nah, niestety cały czas ten sam efekt…

  5. Dex April 1, 2007 at 10:56 pm #

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

  6. radmen April 1, 2007 at 10:56 pm #

    Hehehe nie wątpię :D

  7. fooshmer April 1, 2007 at 10:56 pm #

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

    # have fun :)

  8. Dex April 1, 2007 at 10:56 pm #

    radmen:

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

  9. radmen April 1, 2007 at 10:56 pm #

    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 ;/

  10. Dex April 1, 2007 at 10:56 pm #

    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ć ;)

  11. radmen April 1, 2007 at 10:56 pm #

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

    Edit: dzięki :)

  12. Ewela April 1, 2007 at 10:56 pm #

    troszkę to skomplikowane… :)