Portál AbcLinuxu, 7. prosince 2025 09:43
ls neukazuje dole souhrn podobný DOSovskému dir.
Někdo může namítnout, že to dělá příkaz du, jenže ten se chová (pro můj vkus) dost podivně - vzhled výpisu je dost odlišný od ls atd. Nebudu to teď rozebírat, každý si du může vyzkoušet sám. Nakonec jsem po delší době skončil s docela šikovným skriptem, třeba se někomu taky bude hodit. Podotýkám, že programování v bashi nesnáším a moje vědomosti se v něm blíží nule (než jsem přišel na to, že uvnitř hranatých závorek podmínky "if" musí nutně být vlevo/vpravo mezery, to mi dalo zabrat). Skript se může nazvat jakkoli, já si ho hodil do ~/bin/, nazval jsem ho "dir" a mám v .bashrc alias se zkratkou "lu" (něco jako "list usage") kvůli kratšímu názvu
Tak tady je ta šílenost:
#!/bin/bash
# 2010-12-25 version 0.1
ls -oFX --color=auto --group-directories-first --time-style=long-iso;
echo ==========;
t=`du --human-readable --separate-dirs --one-file-system --summarize`;
# next line strips the dot at the end of the string
t=${t%\.}
f=0; for i in `find -maxdepth 1 -type f`; do let f++; done;
h=0; for i in `find -maxdepth 1 -type f -name ".*"`; do let h++; done;
if [ $f == 1 ] ; then
str1="FILE"
else
str1="FILES"
fi
if [ $h == 1 ] ; then
str2="FILE"
else
str2="FILES"
fi
echo "TOTAL SIZE $t IN $f $str1 ($h HIDDEN $str2)";
Jak si pozorný čtenář povšiml, přidal jsem i výpis počtu souborů a kolik je z toho skrytých souborů. Dále jsem "opravil" to, kvůli čemu by zasloužil Micro$oft nakopat do zadku: v DOSu se totiž vypisovalo(stále vypisuje?) "file(s)", místo aby se bralo v potaz jednotné a množné číslo. Ještě jednou upřesňuji, že se celkový součet všech velikostí týká pouze souborů v aktuálním adresáři.
Jakékoli nápady na zlepšení/zjednodušení uvítám.
P.S. Proč sem nejde vložit 8-bitové PNG??? Bere to jen 24-bitové.
Tiskni
Sdílej:
Slušeno by se k tomu ls přidat i parametr -h
ls -ll
mrkva@Destiny:~$ if [ 0 -eq 0 ]; then echo j; else echo n; fi j mrkva@Destiny:~$ if 0 -eq 0; then echo j; else echo n; fi bash: 0: příkaz nenalezen n(Jasně, je tu test).
if grep neco soubor > /dev/null then echo "neco je v souboru" fi
test stejně často bývá hardlink na [. A kdyby šlo o to porovnání, tak máme třeba ještě expr:
if expr $f '=' 1 > /dev/null then ... fiPamatuju si, na svůj první unixový předmět - přednášející nám říkal: "Za if je příkaz, když mi někdo bude u zkoušky tvrdit, že test nebo hranatá závorka, tak ho vyhodím."
if [ $f == 1 ] ; then jen odeberu závorky, tak to fungovat prostě nebude.
Za if je příkazBlbě, za if je jeden nebo více příkazů.
grep neco soubor && echo "neco je v souboru"? Nebo jeste neco jinyho?
Když už, takfor i in `find -maxdepth 1 -type f`; do let f++; done;
find -maxdepth 1 -type f | wc -l a určitě by to šlo ještě úsporněji.
Mimochodem, skutečně budou čísla sedět, když bude v aktuálním adresáři soubor, který bude mít v názvu nějaký znak z $IFS?
#!/bin/bash
# 2010-12-25 version 0.2
ls -oFX --color=auto --group-directories-first --time-style=long-iso
echo ==========
t=`du --human-readable --separate-dirs --one-file-system --summarize`
# next line strips the dot at the end of the string
t=${t%\.}
f=`find -maxdepth 1 -type f | wc -l`
h=`find -maxdepth 1 -type f -name ".*" | wc -l`
if [ $f -eq 1 ] ; then
str1="FILE"
else
str1="FILES"
fi
if [ $h -eq 1 ] ; then
str2="FILE"
else
str2="FILES"
fi
echo "TOTAL SIZE $t IN $f $str1 ($h HIDDEN $str2)"
Uz zbyva jen urychlit prvni spusteni (napr. v ~/ je to dost znat, domnivam se, ze to zpusobuje "du", ktery i pres parametr --summarize stejne leze do podadresaru a neco tam pocita). Vedel by nekdo, jak na to?
To prostě přečte proleze vše. Druhé spuštění je rychlé jen proto, že se to pak nakešovalo.
Tenhle skriptík je sice hezký, ale právě tenhle důvod bude jeden z těch proč to už v unixu takhle uděláno není.
ls a soucet bajtu me vetsinou nezajima. Tenhle skriptik se mi hodi jen obcas.
je to dost znatTak to toho máš v ~ ještě celkem málo, když je to „jenom“ dost znát:
78G . real 2m2.525s user 0m1.416s sys 0m7.132s
58G . real 4m32.711s user 0m0.280s sys 0m2.920s
No jo, ja taky cpu velka data na externi disk, takze se u me jedna jen asi o 4 sekundy.
Mimochodem jak zmeris ten cas, to jde jakym prikazem?
$ time du -s --si * 17k lost+found 15G marian 1,7M test real 0m21.347s user 0m0.830s sys 0m0.379s
ls zobrazit reálný součet bajtů? Když použiju
ls -l --block-size=1
tak dostanu zřejmě číslo, které vyjadřuje celkové zabrané místo na disku.
Upřesním:
total 32768 -rw-r--r-- 1 ghaad users 4615 Dec 7 11:12 file1.inc -rw-r--r-- 1 ghaad users 4666 Dec 7 10:52 file2.inc -rw-r--r-- 1 ghaad users 5447 Dec 7 11:02 file3.inc -rw-r--r-- 1 ghaad users 5267 Dec 7 11:06 file4.incNa disku soubory zabírají dohromady zřejmě 32768 bajtů, reálný součet je ale 19995 bajtů. Ten můj šílený skript přepisuju, jde to celé opravdu napsat o dost čistěji a bez použití
du, čímž eliminuju tu pomalost při prvním spuštění.
alias ll='ls -l' alias lh='ls -ld .*' alias xdu='du -hs *' alias xdh='du -hs .[^.]*'
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.