ls -lh ger fel output på stora filer

Discussion in 'Allmänt' started by Jaman42, Apr 18, 2014.

  1. Jaman42

    Jaman42 Baby Droid Medlem

    Joined:
    Apr 6, 2014
    Messages:
    20
    Likes Received:
    16

    MINA ENHETER

    Hej,
    Om jag kör ls -lh på små filer så ger den korrekt output men om jag kör den på filer som är 4GB + så får jag t ex 394 005 664 när det igentligen borde vara 4 688 972 960. Det jag försöker göra är köra os.path.getsize() i Python men det ger mig också 394 005 664.

    Enda alternativet jag hittat hitills som fungerar är "stat -c %s" som ger mig korrekt storlek 4 688 972 960.

    Någon som vet varför ls -lh och os.path.getsize() ger mig fel output på stora filer?
     
  2. henca

    henca Senior Droid Medlem

    Joined:
    Dec 30, 2009
    Messages:
    1 335
    Likes Received:
    211

    MINA ENHETER

    Det ser ut som om du drabbas av en 32-bitars overflow. En unsigned 32 bitars int kan innehålla tal som är max 4294967295. I talet 4 688 972 960 är den 33e biten satt. När den 33e biten blir nollställd får du 394 005 664.

    m v h Henrik
     
    Jaman42 and svenix like this.
  3. Jaman42

    Jaman42 Baby Droid Medlem

    Joined:
    Apr 6, 2014
    Messages:
    20
    Likes Received:
    16

    MINA ENHETER

    Hej Henrik,
    Skönt att få en förklaring som "makes sense" :)

    Finns det något sätt att fixa det på eller är det helt enkelt så mitt system fungerar med nuvarande kernel?
     
  4. henca

    henca Senior Droid Medlem

    Joined:
    Dec 30, 2009
    Messages:
    1 335
    Likes Received:
    211

    MINA ENHETER

    Med tanke på att applikationen stat fungerar så ligger inte problemet i din kernel utan i de applikationer som har problemet.

    Jag blir lite förvånad att ls -lh skulle ge ett sådant problem, applikationen ls är ju gjord just för att lista filer och så vitt jag vet brukar ls kunna hantera filer större än 4 GB även på 32-bitars system.

    Dessutom innebär ju flaggan "-h" att storleken skall visas som "human readable" med suffix som k, M eller G. Därför borde du med ls -lh fått se något i stil med "4471M".

    Vad är det för system som du har problemet på?

    m v h Henrik
     
  5. Jaman42

    Jaman42 Baby Droid Medlem

    Joined:
    Apr 6, 2014
    Messages:
    20
    Likes Received:
    16

    MINA ENHETER

    Det är en Radxa Rock, jag har testat både Android 4.2.2 och 4.4.2.
     
    Last edited: Apr 26, 2014
  6. henca

    henca Senior Droid Medlem

    Joined:
    Dec 30, 2009
    Messages:
    1 335
    Likes Received:
    211

    MINA ENHETER

    Efter att ha googlat lite tycker jag att det verkar som om den även skall kunna boota Ubuntu, hur uppför sig ls i ubuntu?

    På min telefon som kör Android 1.6 klagar ls om man försöker göra "ls -h", d v s det går inte alls. Från dina exempel verkar det som om "ls -h" iallafall ger output, men ett felaktigt output.

    Har du i Android tillgång till kommandot "strace"? I så fall skulle du kanske kunna se när det går fel om du gör:

    strace ls -l storfil

    m v h Henrik
     
  7. Jaman42

    Jaman42 Baby Droid Medlem

    Joined:
    Apr 6, 2014
    Messages:
    20
    Likes Received:
    16

    MINA ENHETER

    Hej igen Henrik,
    Det är busybox som ger mig -h funktionaliteten.

    Just att ls -l inte fungerade som det ska visade sig vara att jag installerade en annan version på den integrerade versionen av busybox. Jag visste inte att det redan fanns integrerat.

    Så ls -l fungerar nu som det ska!

    os.path.getsize() i Python fungerar fortfarande inte men det är nog snarare något fel i mitt Python paket så det blir till att felsöka på annat forum.

    Tack så mycket för all hjälp!