#!/usr/bin/env sh # Description: Clean filename or dirname (either hovered or selections) # to be more shell-friendly. # This script replaces any non A-Za-z0-9._- char # with underscore (_). # # LIMITATION: Won't work with filename that contains newline # # Dependencies: sed # # Shell: POSIX compliant # Author: Benawi Adha prompt=true sel=${NNN_SEL:-${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection} IFS=' ' cleanup() { printf "%s" "$1" | sed -e 's/[^A-Za-z0-9._-]/_/g' } if [ -s "$sel" ]; then targets=$(sed -e "s/\\x0/\\n/g;\$a\\" "$sel" | \ while read -r i; do basename "$i"; done) 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