Проблема кодировки символов с именами файлов - найти неправильные имена файлов

У меня есть проблема, описанная в этой Q & A . Вероятно, из довольно старых дистрибутивов Linux или из Windows у меня есть несколько файлов с неработающими именами файлов. ls отображает "?" вместо сломанного персонажа. Я успешно переименовал некоторые из этих файлов, но я не знаю, нашел ли я их все.

Есть ли способ найти все затронутые файлы?

5
задан 13 April 2017 в 15:24

3 ответа

Предполагая, что вы используете кодировку utf-8 (по умолчанию в Ubuntu), этот сценарий должен, надеюсь, идентифицировать имена файлов и переименовать их для вас.

Работает, используя find с C-кодировкой (ascii) для поиска файлов с непечатными символами в них. Затем он пытается определить, являются ли эти непечатаемые символы символами utf-8 или нет. Если нет, он показывает вам имена файлов, декодированные для каждой из кодировок, перечисленных в массиве enc, что позволяет вам выбрать тот, который выглядит правильно, чтобы переименовать его.

latin1 обычно использовался в старых системах linux, а windows-1252 сейчас широко используется в windows (я думаю). iconv -l покажет вам список возможных кодировок.

#!/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)
0
ответ дан 13 April 2017 в 15:24

Попробуйте:

find / | grep -P "[\x80-\xFF]"

Это позволит найти все не-ASCII символы в именах файлов и папок и помочь вам найти виновных: P

0
ответ дан 13 April 2017 в 15:24

Начните с этой команды поиска регулярных выражений и изменяйте ее, пока не попадете только в тех, кого вы интересуете: find . | egrep [^a-zA-Z0-9_./-\s].
В приведенном выше примере будут найдены имена файлов, которые не имеют символов UTF-8.

0
ответ дан 13 April 2017 в 15:24

Другие вопросы по тегам:

Похожие вопросы: