Portál AbcLinuxu, 6. listopadu 2025 02:25
cd /root/capture
for f in `ls *.cfile | sort`; do
rm "$f"
perc=`df -H / | grep linuxroot | tr -s " " | cut -d " " -f 5 | tr -d "%"`
if [ "$perc" -le 90 ]; then
break
fi
done
for f in `ls -rt *`; do
# výpis adresare v reverzním času
perc=`du -s | cut -f 1`
# perc je velikost adresáře
if [ "$perc" -le 100000000 ]; then
# je-li mensi nez 100G tak skoncit cyklus
break
fi
rm "$f"
# smazu nestarsi a pokracuji v cyklu
done
perc je velikost adresářeAch jo...
Spíš bych doporučil
ls -1rt | while read f; do
...
done
nebo
while read f; do done < <(ls -1rt)
aby se to nerozsypalo při mezeře ve jméno soubotu (která je bohužel celkem běžná), ale až při newline (což naštěstí až tak běžné není).
A taky bych asi nepouštěl du na celý adresář v každé iteraci, ale odečítal velikosti (podle du) mazaných souborů. Pokud tam jsou hardlinky, tak to sice nevyjde správně, ale to by se dalo ošetřit tak, že vnořím dva cykly do sebe, ve vnějším budu kontrolovat celý adresář a ve vnitřním jen počítat velikosti mazaných souborů.
find . -type f -a -size +1000 -a -size -1100 -printf '%T@ %s %p\n' | sort -n -k2 -r | awk -v maxsize=8887776 '{size+=$2}; size > maxsize{print $3}'
S tím je možné nastavit i další užitečné věci, jako třeba mazání jen souborů určité velikosti, nebo jen do určité hloubky, prostě vše co find nabízí. -- Další rouru a xargs rm nebo while už si každý doplní sám; uvedený příkaz jen generuje list. Já bych to nejspíš udělal ještě tak, aby to zanechalo třeba prázdný soubor s příponou del, pokud bych to mazal někomu jinému.
pokud nechají expandovat seznam o tisíci položkách v argumentu příkazu for, tak bude mít shell co dělat
Pokud se nebavíme o nějakém extrémně slabém stroji, tak s tisícem položek bash rozhodně problém mít nebude. Pro jistotu jsem zkusil porovnat rychlost
for f in *; do echo "$f"; done >/dev/null ls | while read f; do echo "$f"; done >/dev/nullv adresáři s 10000 soubory (kvůli potlačení nesouvisejících vlivů na tmpfs). U prvního příkazu vycházelo průměrně 59 ms, u druhého 119 ms. I pro 100000 souborů vycházejí obě čísla přibližně desetkrát vyšší, takže poměr je pořád stejný.
find . -type f -a -size +100M -printf '%T@ %s %p\0' | sort -z -r -n -k1 | awk -v RS="\0" -v maxsize=1300000000 '{size+=$2}; size > maxsize{$1="";$2="";system("echo \047"$0"\047")}'
One-liner tedy začne odstranňovat (nyní jen vytiskne) soubory z aktuálního adresáře při zaplnění adresáře soubory o velikosti nad 1.3G. Odstraňovat se budou jen soubory > 100M. \047 jsou apostrofy, které mají chránit argument před expanzí shellu (snad to funguje).
...;$2="";sub(/* /,""); printf "%s\0", $0}' | xargs -0 echotakto se spustí echo (tedy rm) jen jednou a bez shellu a všechny znaky jsou brány jako obyčejné (už žádné metaznaky není třeba ošetřovat).
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.