From e41c1a4c519cb7974e1161342cf1394064defed5 Mon Sep 17 00:00:00 2001 From: fatalerrors Date: Wed, 25 Mar 2026 16:10:41 +0100 Subject: [PATCH] harden rmspc, better median calculation in file_stats --- profile.d/filefct.sh | 40 ++++++++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/profile.d/filefct.sh b/profile.d/filefct.sh index 7ae7f66..aac26ac 100644 --- a/profile.d/filefct.sh +++ b/profile.d/filefct.sh @@ -48,7 +48,7 @@ expandlist() fi local result="" - for item in "$1"; do + for item in "$@"; do for content in "$item"; do result+="\"$content\" " done @@ -121,8 +121,9 @@ clean() local dirlist=("$@") [[ ${#dirlist[@]} -eq 0 ]] && dirlist=(".") - [[ ! $recursive ]] && local findopt="-maxdepth 1" - [[ ! $force ]] && local rmopt="-i" + local findopt=() rmopt + [[ ! $recursive ]] && findopt=(-maxdepth 1) + [[ ! $force ]] && rmopt="-i" unset recursive force for dir in $dirlist; do @@ -241,24 +242,28 @@ rmspc() [[ $substchar == "none" ]] && local substchar="" [[ $verb ]] && local mvopt="-v" + shopt -s nullglob for f in *; do [[ $recurs ]] && [[ -d "$f" ]] && ( [[ $verb ]] && disp I "Entering directory $(pwd)/$f ..." local lastdir=$f pushd "$f" >/dev/null - rmspc $@ + rmspc ${recurs:+-r} ${substchar:+-c "$substchar"} ${verb:+-v} ${shell:+-s} popd >/dev/null [[ $verb ]] && disp I "Leaving directory $(pwd)/$lastdir" unset lastdir ) - if [[ $(echo $f | grep " ") ]]; then + if [[ "$f" == *" "* ]]; then local newf="${f// /${substchar}}" - local command="mv $mvopt \"$f\" \"$newf\"" - if [[ $shell ]]; then - echo $command + [[ "$f" == "$newf" ]] && continue # protection but should never happen + if [[ -n $shell ]]; then + echo "mv ${mvopt:+$mvopt }\"$f\" \"$newf\"" else - $command + mv ${mvopt:+$mvopt} "$f" "$newf" || { + disp E "Failed renaming \"$f\" to \"$newf\"." + continue + } fi fi done @@ -448,9 +453,14 @@ local human=0 details=0 only_avg=0 only_med=0 only_count=0 only_total=0 } average = total / count - # Simple sort for median (awk is not very good at this, we use existing logic) - if (count % 2 == 1) median = sizes[(count + 1) / 2] - else median = (sizes[count / 2] + sizes[count / 2 + 1]) / 2 + + # Median calculation: exact using sorted array values + if (count % 2 == 1) { + median = sizes[(count + 1) / 2] + } else { + idx = count / 2 + median = (sizes[idx] + sizes[idx + 1]) / 2 + } if (only_avg) out("Average size", average, 1) else if (only_med) out("Median size", median, 1) @@ -574,7 +584,8 @@ export -f findbig # -d : display details (ls -l) for each file # -x : do not cross filesystem boundaries # --delete : delete empty files and display their paths -findzero() { +findzero() +{ local delete=0 details=0 one_fs=0 no_change=0 local PARSED @@ -647,7 +658,8 @@ export -f findzero # -d : display details (ls -l) for each link # -x : do not cross filesystem boundaries # --delete : delete dead links and display their paths -finddead() { +finddead() +{ local delete=0 details=0 one_fs=0 no_change=0 local PARSED