Bash scriptaus kyssäri

Elikkäs osaisko joku opastaa kuinka findilta saatas for silmukkaan tiedostojen nimet niin että välilyönnit tiedostojen nimissä pysyisivät huomiotta.
Seuraavilla tavoilla jo kokeilin mutta eipä ainakaan niillä toiminut.

for i in `find . -iname "*.jpg"` do echo "$i" done

Hipsukoitakin koitin mutteivät nekään auttaneet

for i in `find . -iname "*.jpg" -exec echo \"{}\" \;` do echo $i done

Olisin hyvin kiitollinen jos joku valaisisi asiaa minulle :slight_smile: kiitos jo etukäteen.

Minäkään en tiedä, miten asia ratkaistaan for-silmukassa, mutta perinteinen tapahan on ollut käyttää findin -print0-komentoa ja xargs -0:aa:

…mutta useamman komennon ajaminen echon tilalla on kyllä, erhm, aika vaikeaa. Parametrin sijoittaminen tiettyyn paikkaan kyllä onnistuu:

(Huom! -0 = nolla, samoin -print0 = print-nolla)

Olit aika lähellä ratkaisua. Tehdään kaksi koetiedostoa joissa riittävästi välilyöntejä:

1 2 3 4
a b c d

Tämä pätkii jos tiedostonimessä on välilyönti:

./1
2
3
4
./a
b
c
d

Ja tämä ei:

./1 2 3 4
./a b c d

Kysyjä ei liene enää paikallakaan, mutta jatketaan nyt aljettiin :slight_smile:

Yksi ratkaisu on tietenkin käyttää komentotulkkien ominaisuuksia. zsh:ssa tämä on toiminut kauan ja eikös nykyään jo Bashissakin:

for f in **/*.jpg; do echo $f done

Mutta koska tuo löytää kaikki tiedostot, myös hakemistot, parempi ehkä varmistaa:

for f in **/*.jpg(.); do echo $f done

(.) löytää pelkkiä tavallisia tiedostoja.

Tuo tuplatähti toimii BASH: in kanssa vain jos erikseen asettaa sen päälle:

Tehdäänpä aluksi hieman testimateriaalia, luodaan tiedostoja joiden nimessä on välilyöntejä:

ja joitakin kansioita:

Ja testaamaan:

shopt -s globstar for f in **/*.jpg; do echo $f; done
0 a b c.jpg
1 a b c.jpg
2 a b c.jpg
3 a b c.jpg
4 a b c.jpg
5 a b c.jpg
6 a b c.jpg
7 a b c.jpg
8 a b c.jpg
9 a b c.jpg
kansio0.jpg
kansio1.jpg
kansio2.jpg
kansio3.jpg

bash: lauseoppivirhe lähellä odottamatonta avainsanaa ”(”

eli jälkimmäinen ei onnistu tuollaisenaan BASH: llä. Tuo toinen globbausominaisuus on ZSH: n erikoisuus “qualified suffixes” ja tällöin pitää olla extended globbing päällä että nuo toimivat:

Juu ja se oletusarvoisesti on. zsh rulettaa OK :wink: