#!/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