From 71a9a0d9104ed4eef0e66556520817e9bc36b310 Mon Sep 17 00:00:00 2001 From: Joachim Desroches Date: Tue, 23 Mar 2021 16:10:41 +0100 Subject: [PATCH] Add script to find encoding problems in file names. --- find-encoding-barfed-files.sh | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100755 find-encoding-barfed-files.sh diff --git a/find-encoding-barfed-files.sh b/find-encoding-barfed-files.sh new file mode 100755 index 0000000..3882925 --- /dev/null +++ b/find-encoding-barfed-files.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +# list of encodings to try. (max 10) +enc=( latin1 windows-1252 ) + +while IFS= read -rd '' file <&3; do + base=${file##*/} dir=${file%/*} + + # if converting from utf8 to utf8 succeeds, we'll assume the filename is ok. + iconv -f utf8 <<< "$base" >/dev/null 2>&1 && continue + + # display the filename converted from each enc to utf8 + printf 'In %s:\n' "$dir/" + for i in "${!enc[@]}"; do + name=$(iconv -f "${enc[i]}" <<< "$base") + printf '%2d - %-12s: %s\n' "$i" "${enc[i]}" "$name" + done + printf ' s - Skip\n' + + while true; do + read -p "? " -n1 ans + printf '\n' + if [[ $ans = [0-9] && ${enc[ans]} ]]; then + name=$(iconv -f "${enc[ans]}" <<< "$base") + mv -iv "$file" "$dir/$name" + break + elif [[ $ans = [Ss] ]]; then + break + fi + done +done 3< <(LC_ALL=C find . -depth -name "*[![:print:][:space:]]*" -print0)