forked from mirror/nnn
75 lines
1.9 KiB
Bash
Executable file
75 lines
1.9 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
|
|
# Description: Clean filename or dirname (either hovered or selections)
|
|
# to be more shell-friendly. This script cleans
|
|
# non A-Za-z0-9._- characters.
|
|
# and replaces it with underscore (_).
|
|
#
|
|
# It supports cleaning single/double quote, newline,
|
|
# leading, trailing spaces.
|
|
#
|
|
# eg.
|
|
# to be continued (つづく).mp4 -> to_be_continued______.mp4
|
|
# [work] stuff.txt -> _work__stuff.txt
|
|
# home's server -> home_s_server
|
|
# qwe\trty -> __qwe_rty
|
|
#
|
|
# And if there are two almost similar filenames
|
|
# like: 'asd]f' and 'asd f' both will be renamed to 'asd_f',
|
|
# to avoid overwriting, the last file will be prepended by _.
|
|
# So they will be: 'asd_f' and '_asd_f'
|
|
#
|
|
# Dependencies: sed
|
|
#
|
|
# Shell: Bash
|
|
# Author: Benawi Adha
|
|
|
|
prompt=true
|
|
sel=${NNN_SEL:-${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection}
|
|
|
|
cleanup() {
|
|
# printf "%s" "$1" | sed -e 's/[^A-Za-z0-9._-]/_/g'
|
|
printf "%s" "$1" | sed 's/[^A-Za-z0-9._-]/_/g' | sed ':a;N;$!ba;s/\n/_/g'
|
|
}
|
|
|
|
if [ -s "$sel" ]; then
|
|
targets=()
|
|
while IFS= read -r -d '' i || [ -n "$i" ]; do
|
|
targets+=( "$(basename "$i")" )
|
|
done < "$sel"
|
|
else
|
|
targets=("$1")
|
|
fi
|
|
|
|
for i in "${targets[@]}"; do
|
|
printf "%s -> %s\n" "$i" "$(cleanup "$i")";
|
|
done
|
|
|
|
if $prompt; then
|
|
echo
|
|
printf "Proceed [Yn]? "
|
|
read -r input
|
|
case "$input" in
|
|
y|Y|'')
|
|
;;
|
|
*)
|
|
echo "Canceled"
|
|
exit
|
|
;;
|
|
esac
|
|
fi
|
|
|
|
for i in "${targets[@]}"; do
|
|
if [ "$i" != "$(cleanup "$i")" ]; then
|
|
tmp=''
|
|
if [ -e "$(cleanup "$i")" ]; then
|
|
tmp='_'
|
|
fi
|
|
mv -- "$i" "$tmp$(cleanup "$i")";
|
|
fi
|
|
done
|
|
|
|
# Clear selection
|
|
if [ -s "$sel" ] && [ -p "$NNN_PIPE" ]; then
|
|
printf "-" > "$NNN_PIPE"
|
|
fi
|