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