harden rmspc, better median calculation in file_stats
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user