#! /usr/bin/env bash find_name(){ find test -name "*[\\/:\*\?\"<>\|]*" -o -name "*." } check_name() { if [ "$(find_name | wc -l)" != "0" ]; then printf '%s\n\n' "The following filenames contain unwanted characters:" find_name printf '\n%s\n%s\n' "Please run ./rename_test.sh" "If the problem persist, please open an issue." exit 1 else echo "Ok" fi } rename_test() { local filename local new_filename while read -r filename; do # Even though it looks < and > are replaced by the same < and >, the latters are not ASCII code # If you check with 'cat -v rename_test.sh' you would see 's//M-KM-^C/g' # M-KM-^B -> U+02C2 # M-KM-^C -> U+02C3 new_filename=$(echo "$filename" | sed -r \ -e "s/\"/'/g" \ -e 's//˃/g' \ -e 's/^(.*)\.$/\1/' ) printf '%s\n%s\n\n' "$filename" "$new_filename" [ "$filename" != "$new_filename" ] && git mv "$filename" "$new_filename" done < <(find_name) if [ "$(find_name | wc -l)" != "0" ]; then echo "Still some files to treat:" find_name else echo "Done" fi } main() { if [ "$1" = "--check" ]; then check_name else rename_test fi } main "$@"