harden rmspc, better median calculation in file_stats

This commit is contained in:
fatalerrors
2026-03-25 16:10:41 +01:00
parent 60dfe19049
commit e41c1a4c51

View File

@@ -48,7 +48,7 @@ expandlist()
fi fi
local result="" local result=""
for item in "$1"; do for item in "$@"; do
for content in "$item"; do for content in "$item"; do
result+="\"$content\" " result+="\"$content\" "
done done
@@ -121,8 +121,9 @@ clean()
local dirlist=("$@") local dirlist=("$@")
[[ ${#dirlist[@]} -eq 0 ]] && dirlist=(".") [[ ${#dirlist[@]} -eq 0 ]] && dirlist=(".")
[[ ! $recursive ]] && local findopt="-maxdepth 1" local findopt=() rmopt
[[ ! $force ]] && local rmopt="-i" [[ ! $recursive ]] && findopt=(-maxdepth 1)
[[ ! $force ]] && rmopt="-i"
unset recursive force unset recursive force
for dir in $dirlist; do for dir in $dirlist; do
@@ -241,24 +242,28 @@ rmspc()
[[ $substchar == "none" ]] && local substchar="" [[ $substchar == "none" ]] && local substchar=""
[[ $verb ]] && local mvopt="-v" [[ $verb ]] && local mvopt="-v"
shopt -s nullglob
for f in *; do for f in *; do
[[ $recurs ]] && [[ -d "$f" ]] && ( [[ $recurs ]] && [[ -d "$f" ]] && (
[[ $verb ]] && disp I "Entering directory $(pwd)/$f ..." [[ $verb ]] && disp I "Entering directory $(pwd)/$f ..."
local lastdir=$f local lastdir=$f
pushd "$f" >/dev/null pushd "$f" >/dev/null
rmspc $@ rmspc ${recurs:+-r} ${substchar:+-c "$substchar"} ${verb:+-v} ${shell:+-s}
popd >/dev/null popd >/dev/null
[[ $verb ]] && disp I "Leaving directory $(pwd)/$lastdir" [[ $verb ]] && disp I "Leaving directory $(pwd)/$lastdir"
unset lastdir unset lastdir
) )
if [[ $(echo $f | grep " ") ]]; then if [[ "$f" == *" "* ]]; then
local newf="${f// /${substchar}}" local newf="${f// /${substchar}}"
local command="mv $mvopt \"$f\" \"$newf\"" [[ "$f" == "$newf" ]] && continue # protection but should never happen
if [[ $shell ]]; then if [[ -n $shell ]]; then
echo $command echo "mv ${mvopt:+$mvopt }\"$f\" \"$newf\""
else else
$command mv ${mvopt:+$mvopt} "$f" "$newf" || {
disp E "Failed renaming \"$f\" to \"$newf\"."
continue
}
fi fi
fi fi
done 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 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] # Median calculation: exact using sorted array values
else median = (sizes[count / 2] + sizes[count / 2 + 1]) / 2 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) if (only_avg) out("Average size", average, 1)
else if (only_med) out("Median size", median, 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 # -d : display details (ls -l) for each file
# -x : do not cross filesystem boundaries # -x : do not cross filesystem boundaries
# --delete : delete empty files and display their paths # --delete : delete empty files and display their paths
findzero() { findzero()
{
local delete=0 details=0 one_fs=0 no_change=0 local delete=0 details=0 one_fs=0 no_change=0
local PARSED local PARSED
@@ -647,7 +658,8 @@ export -f findzero
# -d : display details (ls -l) for each link # -d : display details (ls -l) for each link
# -x : do not cross filesystem boundaries # -x : do not cross filesystem boundaries
# --delete : delete dead links and display their paths # --delete : delete dead links and display their paths
finddead() { finddead()
{
local delete=0 details=0 one_fs=0 no_change=0 local delete=0 details=0 one_fs=0 no_change=0
local PARSED local PARSED