Nájdite najväčší súbor v aktuálnom adresári

Sumár

ls -1Srah | tail -n1 | xargs wc -c  

Vysvetlenie

ls podporuje možnosť vypísať veľkosť súboru s použitím parametra -s (ten je dokonca súčasťou POSIX štandardu)

ls -s

Oveľa lepšie je to skombinovať s -1, teda vypisovať položky na samostatné riadky.

ls -s1

Výsledkom je:

total 8020
   8 anaconda-ks.cfg
   8 apache-tomcat-7.0.33
7532 apache-tomcat-7.0.33.tar.gz
   8 err
  24 install.log
   8 install.log.syslog
   8 mount.sh
 192 out
 192 out~
   8 porttest
   8 restart-glassfish.sh
   8 timezonetest
  16 Y

Triedenie položiek

Ideálne by bolo zotriediť tieto položky podľa veľkosti. V tomto prípade sa nemusíme unúvať sortom, pretože samotný ls dáva k dispozícii triedenie cez parameter -S (Nie je to síce POSIXový parameter, ale je prítomný na každej rozumnej distribuúcii.)

ls -s1S

Výsledok:

total 8020
7532 apache-tomcat-7.0.33.tar.gz
 192 out
 192 out~
  24 install.log
  16 Y
   8 apache-tomcat-7.0.33
   8 porttest
   8 timezonetest
   8 install.log.syslog
   8 anaconda-ks.cfg
   8 restart-glassfish.sh
   8 err
   8 mount.sh

Už sme skoro na konci — stačilo by zobrať druhý riadok a mali by sme to.

Filtrovanie

Oveľa lepšie je otočiť poradie triedenia (-r) a zobrať posledný riadok cez tail

ls -s1Sr | tail -n1

Výsledok:

7532 apache-tomcat-7.0.33.tar.gz

Skryté súbory?

Náš ls zatiaľ ignoruje skryté súbory (začínajúce .), ale to je drobnosť: stačí dodať parameter -a:

ls -s1Sra | tail -n1

V akom formáte je veľkosť?

Veľkosť jednotlivých položiek nie je udávaná v bajtoch, ale v počte blokov, ktoré položka zaberá. V GNU systémoch (teda v typickom Linuxe) je to našťastie jednoduché: 1 blok má 1024 bajtov. Ukážkou je apache-tomcat-7.0.33.tar.gz, ktorý v skutočnosti zaberá 7696004 bajtov.

POSIXový štandard však definuje 512bajtovú veľkosť bloku. To začne byť problém v momente, ak niekto nastavil striktne POSIXové správanie cez systémovú premennú POSIXLY_CORRECT. Demonštruje to nasledovný miniskript, ktorý nastaví POSIXové správanie, vypíše výsledok a potom obnoví pôvodný stav:

POSIXLY_CORRECT=1; export POSIXLY_CORRECT; ls -s1Sra | tail -n1; unset POSIXLY_CORRECT

Výsledok:

15064 apache-tomcat-7.0.33.tar.gz

Riešenie je obvykle prosté: nastaviť ľudský výpis veľkosti cez -h

ls -s1Sra | tail -n1

Výsledok je:

7.4M apache-tomcat-7.0.33.tar.gz

Reálna veľkosť v bajtoch

Ak by sme chceli vypísať reálnu veľkosť v bajtoch, môžeme použiť wc -c, ktoré nám to presne spočíta.

Na krátkej ukážke:

wc -c apache-tomcat-7.0.33.tar.gz

Výsledok:

7696004 apache-tomcat-7.0.33.tar.gz

Tu stačí umne pokombinovať výpis názvu súboru s jeho zaslaním do parametra pre wc. Ak by sme mali celý skript, vyzeralo by to takto:

FILE=ls -1Sra | tail -n1; 
wc -c $FILE

Všimnime si, že už vynechávame -s, pretože nás samotná veľkosť na výstupe nezaujíma.

Toto sa však dá zjednodušiť pomocou xargs, ktorý načítava dáta zo štandardného vstupu a prevádza ich na parametre pre ďalší príkaz:

ls -1Srah | tail -n1 | xargs wc -c  

Inak povedané, xargs vezme názov súboru, ktorý vypadne z tailu a použije ho ako parameter pre wc -c.

Výsledok je taký, ako chceme:

7696004 apache-tomcat-7.0.33.tar.gz

Alternatívne riešenie cez find

Riešenie

find . -maxdepth 1 -type f -printf "%s %f\n" | sort -n | tail -n1

Vysvetlenie

  • Bodka . hľadá v aktuálnom adresári.
  • -maxdepth 1 zabráni rekurzívnemu vnáraniu. find na rozdiel od ls sa automaticky vnára do podadresárov
  • -type f vyhľadá len regulárne súbory (nie adresáre)
  • -printf je akcia, ktorá spracuje aktuálnu nájdenú položku tým, že ju vypíše na základe formátovacieho reťazca:
    • %s znamená veľkosť súboru v bajtoch
    • %f znamená názov súboru (bez prefixu cesty)
  • sort následne zotriedi výsledok numericky -n
  • tail zoberie poslednú (t. j. najväčšiu) položku a vypíše ju.

Pridaj komentár

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *