Portál AbcLinuxu, 30. července 2025 02:27
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.