#!/bin/sh [ ! -t 0 ] && Xdialog --title "Error" --infobox " Please run this from console. " 0 0 10000 && exit 1 qm='?' excm='!' fcda=/root/my-documents/tmp/fnt-cda export fcda fccc=/root/my-documents/tmp/fnt-c export fccc fcoo=/root/my-documents/tmp/fnt-cont export fcoo unset warnipt unset dte unset warnv unset errv [ -f "$fcoo-no" ] && rm -rf "$fcoo-no" && warnv="$warnv\n Removed old file: $fcoo-no" [ -f "$fcoo" ] && rm -rf "$fcoo" && warnv="$warnv\n Removed old file: $fcoo" [ -f "$fcda-r" ] && rm -rf "$fcda-r" && warnv="$warnv\n Removed old file: $fcda-r" [ -f "$fcda-z" ] && rm -rf "$fcda-z" && warnv="$warnv\n Removed old file: $fcda-z" [ -f "$fccc-w" ] && rm -rf "$fccc-w" && warnv="$warnv\n Removed old file: $fccc-w" # test -z "$(which beep2eos)" && echo " Warning - missing software - no beep2eos, no acoustic warnings." test -z "$(which beep)" && warnv="$warnv\n Warning - missing software: beep" && warnipt=j test -z "$(which defaulttexteditor)" && warnv="$warnv\n Warning - missing software: defaulttexteditor" && warnipt=j && dte=j # test -z "$(which biblia)" && echo " Warning - missing software - no biblia." || source biblia color test ! -z "$(which drd)" && errv="$errv\n Error and exit - software name already in use: drd" test ! -z "$(which drf)" && errv="$errv\n Error and exit - software name already in use: drf" # must be compatible to CLI, no spaces ... jof="A-Za-z0-9./_-" ffswi=/root/.config/fnt/fnt.ini if [ ! -f "$ffswi" ]; then cat > "$ffswi" << "EOF" # Write allowed with recursive renaming, not a dry only report: # swi=write # # mingc: no acute (Apostroph), no dollar, # no double-quotation mark (doppeltes Anfuehrungszeichen), ... # mingc="a-zA-Z0-9@#_./+-" # mingc="a-zA-Z0-9@#()_,.*/+-" # Spaces allowed: # mingc="a-zA-Z0-9' '@#_./+-" # mingc="a-zA-Z0-9' '@#()_,.*/+-" # # Finally if results ask for opening report: query=y EOF fi mingc_default="a-zA-Z0-9@#_./+-" hlp() { echo -e " Syntax: fnt \n autorenaming all directories and files recursively\n successfully processed directories/files\n are logged as \"d-a:\" or \"f-a:\"\n renamed files are reported as \"d-z:\" or \"f-z:\"\n into $fcda\n Failed-renaming-warnings are \n logged as \"d-w:\" or \"f-w:\"\n into $fccc\n (i.e. intended new filename already exists)\n Configuration file: $ffswi\n For write allowed with recursive renaming,\n (not a dry only report of renameables)\n remove hashtag and spaces before swi=write\n Characters allowed by default: $mingc_default\n all other characters become: _\n beware of syntax-rules when changing the\n list of allowed characters: mingc=...\n Query for final extra reports: query=y\n fnt considers files and directories,\n for links try: find -type l" } unset query grep -oqs '^query=y$' $ffswi && query=y unset swi grep -oqs '^swi=write$' $ffswi && swi=write mingt1="$(grep -os --max-count=1 '^mingc="[^"]*"$' $ffswi | cut -f2- -d\" | rev | cut -f2- -d\" | rev)" [ "$mingt1" ] && mingc="$mingt1" && usermingc=j || mingc="$mingc_default" export mingc test "$(/usr/bin/whoami)" != "root" && errv="$errv\n Error and exit - You are not root" [ "$(readlink -e $(which sh))" != "/bin/bash" ] && errv="$errv\n Error and exit - unexpected subshell settings" if [ "$1" ]; then [[ "${1//[$jof]/}" != "" ]] && errv="$errv\n Error and exit - bad user input, allowed characters only: $jof" [ ! -d "$1" ] && errv="$errv\n Error and exit - bad user input, no valid directory" || cd "$1" else errv="$errv\n Error and exit - no user input found" fi [ -f $fcda ] && mv -f $fcda $fcda-old && warnv="$warnv\n renamed old previous fnt-result-file: $fcda -> $fcda-old\n beware - next run overwrites$excm" [ -f $fccc ] && mv -f $fccc $fccc-old && warnv="$warnv\n renamed old previous fnt log file: $fccc -> $fccc-old\n beware - next run overwrites$excm" [ "$warnv" ] && echo -e "$warnv\n" >> $fccc [ "$errv" ] && echo -e "$errv\n" | tee -a $fccc && hlp && exit 1 dptv=1 rpl="_" echo " Start processing directories and files, reporting to $fcda ..." >> $fccc unset z # dry d drd() { find "$ffs" -maxdepth $dptv -mindepth $dptv -type d -print0 | xargs -0 sh -c 'for arg do echo "d-a: $arg" | tee -a $fcda; unset z; unset zex; adn="$(dirname "$arg")"; abn="$(basename "$arg")"; [[ "${abn//[$mingc]/}" != "" ]] && z="$(echo -n "$abn" | tr -c "$mingc" "_")" && unset brk || brk=j; [ -d "$adn/$z" ] && zex=j; [ ! "$zex" -a ! "$brk" ] && echo "d-r: $adn/$z" | tee -a $fcda; [ "$zex" -a ! "$brk" ] && echo "d-w: $arg" | tee -a $fccc; done; [ "$arg" ] && touch $fcoo || touch $fcoo-no' _ } # dry f drf() { find "$ffs" -maxdepth $dptv -mindepth $dptv -type f -print0 | xargs -0 sh -c 'for arg do echo "f-a: $arg" | tee -a $fcda; unset z; unset zex; adn="$(dirname "$arg")"; abn="$(basename "$arg")"; [[ "${abn//[$mingc]/}" != "" ]] && z="$(echo -n "$abn" | tr -c "$mingc" "_")" && unset brk || brk=j; [ -f "$adn/$z" ] && zex=j; [ ! "$zex" -a ! "$brk" ] && echo "f-r: $adn/$z" | tee -a $fcda; [ "$zex" -a ! "$brk" ] && echo "f-w: $arg" | tee -a $fccc; done' _ } # hot d [ "$swi" ] && drd() { find "$ffs" -maxdepth $dptv -mindepth $dptv -type d -print0 | xargs -0 sh -c 'for arg do echo "d-a: $arg" | tee -a $fcda; unset z; unset zex; [[ "${arg//[$mingc]/}" != "" ]] && z="$(echo -n "$arg" | tr -c "$mingc" "_")" && unset brk || brk=j; [ -d "$z" ] && zex=j; [ ! "$zex" -a ! "$brk" ] && mv -fv "$arg" "$z" && echo "d-z: $z" | tee -a $fcda; [ "$zex" -a ! "$brk" ] && echo "d-w: $arg" | tee -a $fccc; done; [ "$arg" ] && touch $fcoo || touch $fcoo-no' _ } # hot f [ "$swi" ] && drf() { find "$ffs" -maxdepth $dptv -mindepth $dptv -type f -print0 | xargs -0 sh -c 'for arg do echo "f-a: $arg" | tee -a $fcda; unset z; unset zex; [[ "${arg//[$mingc]/}" != "" ]] && z="$(echo -n "$arg" | tr -c "$mingc" "_")" && unset brk || brk=j; [ -f "$z" ] && zex=j; [ ! "$zex" -a ! "$brk" ] && mv -fv "$arg" "$z" && echo "f-z: $z" | tee -a $fcda; [ "$zex" -a ! "$brk" ] && echo "f-w: $arg" | tee -a $fccc; done' _ } cont=a ffs="$1" while [ "$cont" ]; do rm -rf $fcoo unset cont drd [ -f $fcoo ] && cont=a let dptv++ done echo -e "\n Processing directories done\n" rm -rf $fcoo-no rm -rf $fcoo # beep -f 800 -l 200 -d 50 -r 2 let dptv-- while [ "$dptv" -gt 0 ]; do drf let dptv-- done echo -e "\n Processing directories and files done\n" echo " Report:" beep -f 800 -l 200 -d 50 -r 3 [ "$usermingc" ] && echo " Characters allowed changed by user - see mingc= in $ffswi" || echo " Characters allowed by default are: $mingc_default" fac=0 [ -f "$fcda" ] && fac="$(cat "$fcda" | grep '^[df]-a: ' | wc -l)" && echo " $fac files and directories found." fae=0 [ -f "$fcda" ] && fae="$(cat "$fcda" | grep '^[df]-z: ' | wc -l)" && echo " $fae files and directories renamed ( f-z: or d-z: )" far=0 [ -f "$fcda" -a ! "$swi" ] && far="$(cat "$fcda" | grep '^[df]-r: ' | wc -l)" && echo " $far renameable files and directories found ( f-r: or d-r: )" && echo " this is a DRY RUN only$excm NOTHING RENAMED yet$excm" test \( $fac -gt 0 -o $fae -gt 0 \) && echo " (for detailed report see $fcda)" fag=0 [ -f "$fccc" ] && fag="$(cat "$fccc" | grep '^[df]-w: ' | wc -l)" [ "$fag" -gt 0 ] && echo " $fag FAILED renamings at files and directories. WARNING$excm" && echo " (i.e. intended new filename already exists)" && echo " for log and details see:" && echo " $fccc" [ "$warnipt" ] && echo " Warnings - see $fccc" echo -e " Beware - log and report will be overwritten$excm" echo " end" >> $fccc qfe=" Queries for extra reports:" qff=" Nothing to report." if [ "$query" = y ]; then if [ "$far" -gt 0 ]; then if [ "$far" -lt 21 ]; then echo -e "$qfe\n" && unset qff echo " Type \"y\" to show renameable-list ... [y/n]" echo antwort="n" echo -n " "; read antwort [ "$antwort" != "y" ] && echo " Skipped by user." || cat "$fcda" | grep '^[df]-r: ' else echo -e "$qfe\n" && unset qff echo " Type \"y\" to show renameable-list in text-editor ... [y/n]" echo antwort="n" echo -n " "; read antwort [ "$antwort" != "y" ] && echo " Skipped by user." || goon111=j [ "$goon111" -a ! "$dte" ] && cat "$fcda" | grep '^[df]-r: ' > "$fcda-r" && defaulttexteditor "$fcda-r" [ "$dte" ] && echo " no text-editor, see logfile" fi fi if [ "$fae" -gt 0 ]; then if [ "$fae" -lt 21 ]; then echo -e "$qfe\n" && unset qff echo " Type \"y\" to show renamed-list ... [y/n]" echo antwort="n" echo -n " "; read antwort [ "$antwort" != "y" ] && echo " Skipped by user." || cat "$fcda" | grep '^[df]-z: ' else echo -e "$qfe\n" && unset qff echo " Type \"y\" to show renamed-list in text-editor ... [y/n]" echo antwort="n" echo -n " "; read antwort [ "$antwort" != "y" ] && echo " Skipped by user." || goon222=j [ "$goon222" -a ! "$dte" ] && cat "$fcda" | grep '^[df]-z: ' > "$fcda-z" && defaulttexteditor "$fcda-z" [ "$dte" ] && echo " no text-editor, see logfile" fi fi if [ "$fag" -gt 0 ]; then if [ "$fag" -lt 21 ]; then echo -e "$qfe\n" && unset qff echo " Type \"y\" to show failed-renamings-list ... [y/n]" echo antwort="n" echo -n " "; read antwort [ "$antwort" != "y" ] && echo " Skipped by user." || cat "$fccc" | grep '^[df]-w: ' else echo -e "$qfe\n" && unset qff echo " Type \"y\" to show failed-renamings-list in text-editor ... [y/n]" echo " (i.e. intended new filename already exists)" echo antwort="n" echo -n " "; read antwort [ "$antwort" != "y" ] && echo " Skipped by user." || goon333=j [ "$goon333" -a ! "$dte" ] && cat "$fccc" | grep '^[df]-w: ' > "$fccc-w" && defaulttexteditor "$fccc-w" [ "$dte" ] && echo " no text-editor, see logfile" fi fi fi [ "$qff" ] && echo "$qff" echo -e " Beware - log and report will be overwritten$excm" # This software comes with absolutely no warranty # License: GNU GPL version 2 # Author: Karl THILL