[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
Komentarze
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).
#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 | #