Osaako joku neuvoa komennon, millä tulostaa tiedostojoukosta sen, jonka versionumero on viimeisin. Esim joukosta:
tiedosto-1.0.0
tiedosto-2.0.0
tiedosto-12.0.0
tiedosto-12.2.0
tiedosto-12.12.0
haluan tulokseksi:
tiedosto-12.12.0
Normaalilla sort-komennolla tuo valinta ei onnistu. Esim.
ls | sort -n | tail -n 1
palauttaa:
tiedosto-2.0
Mikä menee ihan metsään...
tiedosto-1.0.0
tiedosto-2.0.0
tiedosto-12.0.0
tiedosto-12.2.0
tiedosto-12.12.0
haluan tulokseksi:
tiedosto-12.12.0
Normaalilla sort-komennolla tuo valinta ei onnistu. Esim.
ls | sort -n | tail -n 1
palauttaa:
tiedosto-2.0
Mikä menee ihan metsään...
Vastaukset 6
Vanhimmat
myöskään 'ls --sort=v' ei auta tässä tapauksessa, koska haen listan tiedostoista http/ftp palvelimelta.
kokeile tällä:
http://ota.se/mika0800/nsort
siis sitten:
ls | nsort | tail -n 1
Mitäs tuo .bin mahtaa tehdä jos sen ajaa? Jääkö koneesta edes sauhuja jäljelle? Ei vain mutta näin pystyisi linuksissakin levittämään haittaohjelmia, itse en suostuisi ajamaan kyseistä biniä tietämättä varmasti mitä se sisältää, juuri tästä aiheesta on ollut keskustelua ja kiistelyä ja nyt jo tarjotaan tuntematonta ohjemaa ajettavaksi ;D
mörkö.bin
Voihan asian noinkin nähdä,jos haluaa.
Aiotko itse korjata sort komennon -n -option, joka ei tee sitä, mitä oma ohjelmani tekee, vaikka sen dokumentaation mukaa pitäisi niin tehdä.
sort lienee kirjoitettu C:llä tai C :lla, noilla lähdekoodiltaan "selkeillä" kielillä, joten tehtävä ei liene vaikea sille, jonka mielestä C tai C ovat syntaksiltaan selkeitä.
Oman ohjelmani "avain"osa, eli olennaisin funktio on esittelyltään tällainen:
function NumericSortable(S:String):String;
tuon funktion pituus on 39 riviä kylixillä käännettyä koodia. C -kielen hankalamman merkkijonokäsittelyn takia vastaava C -koodi saattaa olla pidempi.
Eipä muuten minullakaan ole kylixin lähdekoodia, se onjossain Borlandilla lukkojen takana.
Kukaan ei muuten estä tekemästä näin:
1. buuttaa koneesi knoppix CD:llä, aseta rootille salasana, luo uusi käyttäjä,ja aja tuo ko.uudenkäyttäjän oikeuksilla.
linuxissahan käyttäjällä on kirjoitusoikeus vain omaan kotihakemistoonsa alihakemistoineen,joskus myös /tmp :iin.
Kuinka moni muuten tutkii linuxjakelunsa lähdekoodit läpikotaisin mahd. kierouksien paljastamiseksi, varsinkin kun linux -jakeluissa mukana olevat ohjelmat ovat suurelta osalta C ja C -koodia. Tuossa toki olisi paljon tehtävää, vaikka ne olisi koodattu esim. kylixillä.
Sopii toki ihmetellä, miksi sort -komennolla on -n -optio, kun se ei tee mitään järkevää...
Siirrettävyys & päivitettävyys? Entä, jos joku päivä käytän ohjelmaasi kaupallisiin tarkoituksiin? Gnu:n C-kirjastoissa on funktio strverscmp() millä tuo valinta hoitu helposti, mutta en mielellään ala kirjoittamaan erillistä ohjelmaa; ensimmäinen lause mielessä.
Taas piti kirjoittaa itse homma uusiksi. Standardityökaluilla homma hoituu vaikka näin...
#!/bin/bash
versioncmp() {
# Check if other NULL
if [ -z "$1" ] && [ -z "$2" ] ; then
return
fi
if [ -z "$1" ] && [ -n "$2" ] ; then
echo "$2"
fi
if [ -z "$2" ] && [ -n "$1" ] ; then
echo "$1"
fi
# Pad leading zeroes for lexical comparison; twice because of strange sed-behaviour
VER1=`echo "$1" | sed -r 's/([^0-9])([0-9][^0-9])/\10\2/g;s/([^0-9])([0-9][^0-9])/\10\2/g' `
VER2=`echo "$2" | sed -r 's/([^0-9])([0-9][^0-9])/\10\2/g;s/([^0-9])([0-9][^0-9])/\10\2/g' `
#echo "$VER1 > $VER2" > /dev/stderr
# Return greatest
if [[ "$VER1" > "$VER2" ]] ; then
echo "$1"
else
echo "$2"
fi
}
for f in `ls *.tar*` ; do
LATEST_VERSION=`versioncmp "$LATEST_VERSION" "$f"`
done
echo $LATEST_VERSION