[ Not now, John! @ 21.06.2005. 18:21 ] @
Kako kreirati listu fajlova u nekom folderu da for petlja uzima u obzir fajl po fajl, bez obzira što u nazivima nekih fajlova postoji razmak?

Ovaj kod
Code:
files=`ls`
for file in $files; do
  echo "-> $file"
done

radi kada nema razmaka u nazivima fajlova, ali ne radi u suprotnom slučaju.
Ako imam sljedeće fajlove:
Code:
fajl1.jpg
fajl2.jpg
moja fotka.jpg
fajl4.jpg

na izlazu dobijam:
Code:
-> fajl1.jpg
-> fajl2.jpg
-> moja
-> fotka.jpg
-> fajl4.jpg

Probao sam sve moguće varijacije komade ls, sa navodnicima, escape sekvencama i sl. i ništa mi nije pomoglo.

Unaprijed hvala.
[ Alef @ 21.06.2005. 19:45 ] @
Code:

for i in *
do echo "$i"
done
[ Not now, John! @ 21.06.2005. 19:56 ] @
Hvala prijatelju. Nije kako sam zamišljao, ali će mi odraditi posao.
Pozdrav.
[ Not now, John! @ 21.06.2005. 20:06 ] @
Hm... ipak neće. Treba da sortiram listu fajlova u nekom folderu prema posljednjem vremenu izmjene, da bih ih preimenovao u rastućem redoslijedu...

Ima li rješenje za to?
[ caboom @ 21.06.2005. 20:20 ] @
mislim da ti je dovoljno:

Code:

files=`ls`
for file in "$files"; do
  echo "-> $file"
done


mrzim da dajem LDP linkove, ali ipak:

http://www.tldp.org/LDP/abs/html/

ako zamislis loop-unrolling, skontaces brzo u cemu je bila greska.
[ Not now, John! @ 22.06.2005. 12:22 ] @
Citat:
caboom: mislim da ti je dovoljno:

Code:

files=`ls`
for file in "$files"; do
  echo "-> $file"
done


mrzim da dajem LDP linkove, ali ipak:

http://www.tldp.org/LDP/abs/html/

ako zamislis loop-unrolling, skontaces brzo u cemu je bila greska.

Gornji kod definitivno ne radi, jer ako stavim $files pod navodnike u for petlji onda $file postane jednako $files, tj. for petlja, uopšte ne ide liniju po liniju. Ako ne stavim navodnike onda smetaju razmaci...

Tu knjigu imam na svom računaru, ali nisam imao vremena da čitam čitavu knjigu zbog jednog problema, jer u sadržaju se ne spominje nešto što bi moglo da riješi ovaj problem.

Ipak, na početku knjige sam našao jednu funkciju koja je riješila problem...

Evo koda:
Code:

processfilelist () {
  while read line; do
    echo "-> $line"
  done
}

files=`ls -1tr`
echo "$files" | processfilelist
[ caboom @ 22.06.2005. 19:53 ] @
tacno... sorry, nisam proverio
[ random @ 04.07.2005. 16:39 ] @
Not Now, John!, to nije rešenje problema, već workaround.

Imena fajlova sa spejsovima su potpuni seks u shell skriptingu. Ovo sa for petljom je još jednostavno (eto, recimo možeš da je zameniš while read petljom).

xargs srećom ima mogućnost da se definiše neki drugi separator, pa ova mogućnost ponekad može biti korisna, kao što ovaj lik pokazuje ovde:

http://hacks.oreilly.com/pub/h/7

Pre neko veče sam baš pisao jedan shell skriptić, i naišao na sledeću muku sa spejsovima.

Recimo da sam imao nešto ovako

SUBTITLE="/Neka Putanja/Neki Film/Neki Film Titl.sub"

Apsolutno ne znam kako da vrednost ove promenljive strpam u drugu promenljivu, a da spejsovi ostanu escape-ovani? Ako pokušam sa

COMMANDLINE="${COMMANDLINE} -sub ${SUBTITLE}"

to, naravno, neće ići, spejsovi u $SUBTITLE stringu će dalje biti tretirani kao i svi drugi spejsovi u COMMANDLINE stringu. Nisam uspeo da rešim ovaj problem, već sam morao da promenim kod, uvodeći if strukturu. Opet workaround, i to ružan. Hoću da mi neko pokaže pravo, robusno rešenje za ovaj problem koje uvek pouzdano radi!
[ random @ 04.07.2005. 17:32 ] @
Post Scriptum:

Q: Kako prepoznati shell skript Linux-centrika?
A: Lako, imaće u prvom redu #!/bin/bash :o)