Hier moet ik een oplossing voor zien te vinden. Heeft iemand goede suggesties?
sh-3.2$ echo ls -f nl/dranken/koffie/. nl/dranken/thee/.|sh
nl/dranken/koffie/.:
2006 1978 2000 1992 .. 1980 1981 . 1986 1983
nl/dranken/thee/.:
1498 .. 1515 . 1521 1507 1501 1495
sh-3.2$ ##########################################
sh-3.2$ # Hetzelfde, maar nu gefilterd door `cat`:
sh-3.2$ ##########################################
sh-3.2$ echo ls -f nl/dranken/koffie/. nl/dranken/thee/.|sh|cat
2006
1978
2000
1992
..
1980
1981
.
1986
1983
nl/dranken/koffie/.:
1498
..
1515
.
1521
1507
1501
1495
nl/dranken/thee/.:
'ls' is op mijn F10 bak een alias voor 'ls --color=auto', misschien
gooit dat roet in het eten. Wat is het resultaat als je 'ls' door
'/bin/ls' vervangt?
Joost
Nou, ls -f is:
do not sort, enable -aU, disable -ls --color
(zowel op Fedora 8 als 10)
--
Groet,
Wietse
> 'ls' is op mijn F10 bak een alias voor 'ls --color=auto', misschien
> gooit dat roet in het eten.
Dat lijkt me niet zo relevant, gegeven dat `ls -f' in een script,
`upact', aangeroepen wordt en niet in een interactieve shell.
Mijn $.02 is dat om een of andere reden de volgorde van files in de
directores gewijzigd is, eerder dan dat `ls -f' echt iets anders doet.
Hetzelfde:
sh-3.2$ echo /bin/ls -f nl/dranken/koffie/. nl/dranken/thee/.|sh|cat
2006
1978
2000
1992
..
1980
1981
.
1986
1983
nl/dranken/koffie/.:
1498
..
1515
.
1521
1507
1501
1495
nl/dranken/thee/.:
sh-3.2$ type ls
ls is hashed (/bin/ls)
Dit is de code waaruit het komt:
tr '.' '/' <active.upact |
awk 'BEGIN {
maxlen = '"$maxlen"'
dirs = ""
ndirs = 0
print "cd '"$NEWSARTS"'"
}
length($1) + length(dirs) > maxlen && ndirs > 0 {
if (ndirs == 1)
print "echo " substr(dirs, 2) ":"
print "ls -f" dirs
dirs = ""
ndirs = 0
}
# the /. on the end eliminates problems with names including ":"
{ dirs = dirs " " $1 "/." ; ndirs++ }
END {
if (ndirs == 1)
print "echo " substr(dirs, 2) ":"
print "ls -f" dirs
print "echo /.:" # simplifies later logic
}' | sh |
(gevolgd door verdere bewerking van deze data).
Het gaat erom dat per directory het hoogste (grootste) getal wordt gevonden.
Elke filenaam is ofwel een geheel getal of een directorynaam.
Zo is er onderscheid tussen nl/newsgroups/announce en nl/newsgroups/345 .
Adri
Gedurende de loop der tijden verdwijnen er files en komen er nieuwe bij,
de nieuwere hebben een filenaam die bestaan uit een hoger nummer.
Ik zal het `ls -f`-probleem nog even verduidelijken a.d.h.v. een voorbeeld;
nu zonder `cat`, maar met en zonder de optie -1 van `ls`:
=====================
sh-3.2$ echo /bin/ls -f nl/dranken/koffie nl/dranken/thee|sh
nl/dranken/koffie:
2006 1978 2000 1992 .. 1980 1981 . 1986 1983
nl/dranken/thee:
1498 .. 1515 . 1521 1507 1501 1495
sh-3.2$ echo /bin/ls -f1 nl/dranken/koffie nl/dranken/thee|sh
2006
1978
2000
1992
..
1980
1981
.
1986
1983
nl/dranken/koffie:
1498
..
1515
.
1521
1507
1501
1495
nl/dranken/thee:
=====================
Zo bezien is
echo ls -f ... | sh | cat
(zie mijn eerste bericht <KGvCD...@news.a3.xs4all.nl> uit deze draad)
eigenlijk een imitatie van
echo ls -f1 ... | sh
Ik denk dat ik `ls -f | tr ' ' '\012'` o.i.d. moet gaan gebruiken.
Adri
> Ik denk dat ik `ls -f | tr ' ' '\012'` o.i.d. moet gaan gebruiken.
Hm, als het je om de volgorde gaat, waarom dan niet
ls -1
of, als lexicografisch sorteren niet voldoet,
ls -1 | sort -n
of, als het in omgekeerde volgorde moet,
ls -1 | sort -r
of
ls -1 | sort -rn
?
Voor elke directory een `sort`? Dat sluit niet aan bij de rest van de code.
Adri
Dat kan nooit een probleem zijn. De huidige code maak unsorted directory
listings en kan daar mee werken, dus die kan nooit op tilt gaan als de
directories toch gesorteerd blijken te zijn.
Misschien is het beter om te kijken wat die scriptkermis nou uiteindelijk
doet en dit even te herbouwen in perl. Als je handig bent in perl dan
is dat zo klaar.
Zo'n script dat bestaat uit een hele pipeline van tooltjes en allerlei
slimme truukjes dat blijft altijd wat kwetsbaar. Is niet de eerste keer
dat zo iets plotseling omvalt.