#!/bin/bash # Replaces odd characters in filenames and directories with an underline # When there are more consecutive odd characters what would result in ____ sth like this, it collates to a single underline. # When the new unixified filename is already taken, a counted suffix will be added before an eventuel period in the filename, otherwise just append. # Will never overwrite a file. # usage: inixify.sh [filename] # filename The file to unixify, can be file or folder. export IFS=$'\n' export fname_full=$1 #export out=$2; function sanitise { local retval=$(echo $1 | gsed -e 's/[^A-Za-z0-9#./_-]/_/g') # replace everything else with _ retval=$(echo $retval | gsed -e 's/\.\{2,\}/\./g') # replace >1 consecutive . with one . retval=$(echo $retval | gsed -e 's/_\{2,\}/_/g') # replace >1 consecutive _ with one _ echo $retval } export current_dir=$(dirname $fname_full) export current_file=$(basename $fname_full) export fname_new=$(sanitise $current_file) # unixify if [ "$current_file" != "$fname_new" ]; then { #any changes been needed? count=1 while [ -e $current_dir/$fname_new ]; do { #new filename already taken? #echo file exists: $current_dir/$fname_new; #add suffix before any dot, if no dot just append if [[ "$fname_new" =~ \. ]]; then { fname_new=$(echo $fname_new | sed -e "s/\./_$count\./g") }; else { fname_new=$fname_new"_$count" }; fi count=$(($count + 1)) }; done echo -n $current_dir/$fname_new if [ "$count" -gt 1 ]; then { echo " suffix nr added: $(($count - 1))" }; else { echo "" }; fi export cmd="mv \"$fname_full\" \"$current_dir/$fname_new\"" # echo $cmd; eval $cmd }; else { echo -ne echo $fname_full" filename already ok." }; fi