ls -lh ger fel output på stora filer

Diskussion i 'Allmänt' startad av Jaman42, 18 apr 2014.

  1. Jaman42

    Jaman42 Baby Droid Medlem

    Blev medlem:
    6 apr 2014
    Inlägg:
    20
    Mottagna gillanden:
    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

    Blev medlem:
    30 dec 2009
    Inlägg:
    1 313
    Mottagna gillanden:
    188

    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 och svenix gillar detta.
  3. Jaman42

    Jaman42 Baby Droid Medlem

    Blev medlem:
    6 apr 2014
    Inlägg:
    20
    Mottagna gillanden:
    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

    Blev medlem:
    30 dec 2009
    Inlägg:
    1 313
    Mottagna gillanden:
    188

    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

    Blev medlem:
    6 apr 2014
    Inlägg:
    20
    Mottagna gillanden:
    16

    MINA ENHETER

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

    henca Senior Droid Medlem

    Blev medlem:
    30 dec 2009
    Inlägg:
    1 313
    Mottagna gillanden:
    188

    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

    Blev medlem:
    6 apr 2014
    Inlägg:
    20
    Mottagna gillanden:
    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!