When you think you’ve succeeded / but something’s missing / means you have been defeated / by greed, your weakness.
1
2
3
| for i in `ls | grep -E "jpg|gif|png|jpeg"`
do echo "Bestand: "$i""
done |
geeft nog steeds:
1
2
3
4
5
| Bestand: met Bestand: verschillende Bestand: spaties.jpg Bestand: weerzonder.jpg Bestand: zonderspatie.jpg |
Hij breekt het volgens mij bij de pipe af, alsof hij het gelijkt afkapt bij een spatie.
When you think you’ve succeeded / but something’s missing / means you have been defeated / by greed, your weakness.
a) Hoe wilde je dat in dat stukje code zien? echo "blabla "$i""?
b) $i bevat losse woorden.
Volgens mij splitst in bash de 'for' bij spaties. Maar ik zou niet weten hoe je het anders zou moeten implementeren zodat ie dat niet doet.
Daarnaast is er weinig reden om ls te gebruiken; gebruik gewoon for i in *.jpg *.png *.jpeg *.gif
Op die manier werkt het zelfs weer gewoon bij mij:
1
2
3
4
5
| [sjon@sjon tmp]$ for f in `ls *.txt` ; do echo - $f - ; done - a - - b.txt - [sjon@sjon tmp]$ for f in *.txt ; do echo - $f - ; done - a b.txt - |
[ Voor 39% gewijzigd door Spider.007 op 03-03-2009 16:48 ]
---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate
Dat is inderdaad wel een goede. Het enige 'foutje' is dat hij, wanneer *.png bijv. niet voorkomt, die ook nog print, maargoed, dat kan eruit gefilterd wordenSpider.007 schreef op dinsdag 03 maart 2009 @ 16:46:
Er weinig reden om ls te greppen; gebruik gewoon ls *.jpg *.png *.jpeg *.gif
Daarnaast is er weinig reden om ls te gebruiken; gebruik gewoon for i in *.jpg *.png *.jpeg *.gif
Op die manier werkt het zelfs weer gewoon bij mij:
code:
1 2 3 4 5 [sjon@sjon tmp]$ for f in `ls *.txt` ; do echo - $f - ; done - a - - b.txt - [sjon@sjon tmp]$ for f in *.txt ; do echo - $f - ; done - a b.txt -
Dit dus:
1
2
3
4
| met verschillende spaties.jpg weerzonder.jpg zonderspatie.jpg *.png |
When you think you’ve succeeded / but something’s missing / means you have been defeated / by greed, your weakness.
Door het stuk dat nutteloos tussen quotes staat niet tussen quotes te zetten.Osiris schreef op dinsdag 03 maart 2009 @ 16:45:
[...]
a) Hoe wilde je dat in dat stukje code zien? echo "blabla "$i""?
blaataaps schreef op dinsdag 03 maart 2009 @ 16:58:
[...]
Door het stuk dat nutteloos tussen quotes staat niet tussen quotes te zetten.
do echo Bestand: "$i"
Levert bij mij alsnog 3 regels output op terwijl het er maar 1 moet zijn
[ Voor 20% gewijzigd door Osiris op 03-03-2009 17:02 ]
1
| for i in * ; do echo Bestand: "$i" ; done |
1
2
3
| find -name '*.jpg' -type f | while read $TXTFILE; do echo "$TXTFILE"; done |
Bij for i in `ls` liep ik tegen hetzelfde probleem aan en for i in * is wat minder flexibel.
Unix doesn't prevent a user from doing stupid things, because that would necessarily prevent them from doing brilliant things.
while true ; do echo -n "bla" ; sleep 1 ; done
Dat is ook erg netjes inderdaad. Ik heb het nu opgelost op de manier zoals al eerder gezegd was door Spider.007, deze dus:Demoniac schreef op dinsdag 03 maart 2009 @ 17:10:
Voor dit soort dingen gebruik ik meestal:
code:
1 2 3 find -name '*.jpg' -type f | while read $TXTFILE; do echo "$TXTFILE"; done
Bij for i in `ls` liep ik tegen hetzelfde probleem aan en for i in * is wat minder flexibel.
1
2
3
4
| for i in *.jpg *.png do echo "Bestand: $i" done |
When you think you’ve succeeded / but something’s missing / means you have been defeated / by greed, your weakness.
Kom ik weer met mijn kruistocht tegen backticks hoor
Ik raad aan om niet `command` te gebruiken, maar in plaats daarvan $(command), omdat dit leesbaarder is en wat andere prettige eigenschappen heeft, zie voor meer informatie deze post.
Als je bash gebruikt, dan kun je het volgende doen:icyx schreef op dinsdag 03 maart 2009 @ 16:54:
Dat is inderdaad wel een goede. Het enige 'foutje' is dat hij, wanneer *.png bijv. niet voorkomt, die ook nog print, maargoed, dat kan eruit gefilterd worden.
shopt -s extglob for I in *.?(jpg|png|gif)
Merk op dat dit heel erg bash-specifiek is (zsh heeft wel vergelijkbare mogelijkheden, overigens), dus dit werkt niet op POSIX sh. Als je deze constructie gebruikt, zet dan ook #! /bin/bash bovenaan je script, en niet #! /bin/sh !
Om toch nog iets toe te voegen:
Zo'n ls | while read fn ; do ... done loopje draait in een sub-shell, dus je moet wel ff uitkijken met scope van vars enzo.
[ Voor 47% gewijzigd door serkoon op 03-03-2009 19:17 . Reden: spuit-11 ]
1
| find -name '*.jpg' -o -name '*.png' -exec echo {} \; |
ASSUME makes an ASS out of U and ME
Verwijderd
1
2
3
4
5
| #!/bin/bash for i in * do echo "$i" | egrep '(jpg|jpeg|gif|png)$' done |
Best wel iets, kijk maarH!GHGuY schreef op dinsdag 03 maart 2009 @ 19:18:
wat is er nou mis met
code:
1find -name '*.jpg' -o -name '*.png' -exec echo {} \;
% ls
meh.jpg test.png
% find -name '*.jpg' -o -name '*.png' -exec echo {} \;
./test.png
%Je bent de haakjes vergeten
% find \( -name '*.jpg' -o -name '*.png' \) -exec echo {} \;
./meh.jpg
./test.png
%Bovendien kun je met find -exec maar één commando aanroepen, met een shell while-loop kun je makkelijk meerdere aanroepen. Je kunt wel weer een shellscript opgeven aan -exec natuurlijk, maar die moet je wel weer maken dan.
Ook zoekt find recursief alle files op, niet alleen die in de huidige directory, dat kan ongewenst zijn (al kun je dat natuurlijk wel weer beinvloeden met -depth oid).
Al met al hangt het een beetje van de situatie af welke van de twee aanpakken het prettigst werkt
1
2
3
4
5
6
7
| oldIFS="$IFS" IFS=" " for f in $(ls) do echo "[$f]" done IFS="$oldIFS" |
Nadeel is dat dit niet meer werkt als er filenamen zijn met newlines erin.