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