Portál AbcLinuxu, 5. listopadu 2025 08:25
du -sm -h $(find $1 -maxdepth 1 -xdev -type d) | sort -g |\
while IFS=",press_CTRL+V+TAB_here" read du x username; do
if [[ "$du" -gt "10" ]]; then
sendmail mail@mail.cz <<-EOE
Blah blah $du$x blah "$username".
EOE
done
fi jako konec podmínky if
Nevim jak ten text rozsekat a vyhodnotit.
Možná by bylo jednodušší otočit pořadí - nejdřív find a teprve pak volat ten du (jenomže tím pak přijdeme o možnost řazení, ale to se dá udělat nakonec). A jak bylo řečeno (tedy napsáno), je lepší poslat souhrn.
#tohle asi nefunguje, ale takhle jsem to myslel
#budeme předpokládat, že v názvu souboru nejsou mezery atp.
find $1 -type d ... | (
while read adresar; do
velikost=`du -sm $adresar | cut '-d' -f 1`;
if [ $velikost -gt 10000000 ]; then
echo "Adresar $adresar je prilis velky ($(( $velikost / 1000 ))KB)"
fi
done
#tímhle přesměrováním si nejsem úplně jist, aby to fungovalo
) >seznam.$$
if [ `wc -l < $seznam.$$` -gt 0 ]; then
mail ... < $seznam.$$
fi
rm -f seznam.$$
ale ani jedno mi nefunguje
Jo, udělal jsem pár překlepů, ale pokud jsem pochopil zadání správně, tak následující skript už by měl být okay.
#!/bin/sh
#budeme hledat jenom adresáře
#(šlo by sem doplnit ještě nastavení rodičovského)
find -type d | (
#výstup pošleme kolonou
#a budeme ho číst řádek po řádku
while read adresar; do
#spočtu souhrnou velikost v bajtech
#(a vezmu jen 1. sloupeček)
velikost=`du -sb $adresar | cut -f 1`;
#jenom ladící výpis (na 1 řádek)
echo "Zpracovavam adresar $adresar o velikosti
$velikost" >/dev/stderr
#je to moc velké?
if [ $velikost -gt 10000000 ]; then
#jenom vypíšu (celý subshell je přesměrován!)
#možná budete chtít upravit jednotky
echo "Adresar $adresar je prilis velky " \
"($(( $velikost / 1000 ))KB)"
fi
done
#a obrovské adresáře si uložím do pomocného souboru
) >seznam.$$
#jestli má pomocný soubor alespoň 1 řádek, tak
if [ `wc -l < seznam.$$` -gt 0 ]; then
#tady se nastaví třeba odeslání mailem nebo tak něco
echo "Byly nalezeny veliké adresáře:"
cat seznam.$$
fi
#uklidíme po sobě
rm -f seznam.$$
(du -sm $(find "$1" -maxdepth 1 -xdev -type d) | sort -g |\
while IFS=" " read velikost adresar; do
if [[ "$velikost" -gt "10" ]]; then
echo "Adresar $adresar ma velikost $velikost M, coz je skoro dost."
fi
done) | sendmail mail@example.com
Spouštět:
skript.sh /var/spool/virtual
Ve výrazu IFS=" " je třeba mezeru nahradit fyzickým znakem tabelátoru (lze vložit většinou třeba ctrl+v+tab nebo jinak).
Výraz sendmail mail@example.com lze pro vyzkoušení nahradit výrazem cat.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.