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ť sort
om, 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 tail
u 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 odls
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.