Problema de codificação de caracteres com nomes de arquivos - localizar nomes de arquivos quebrados

2

Eu tenho o problema descrito em este Q & amp; A . Provavelmente a partir de distribuições linux muito antigas ou de janelas eu tenho vários arquivos com nomes de arquivos quebrados. ls exibe um "?" em vez do personagem quebrado. Renomei com sucesso alguns desses arquivos, mas não sei se encontrei todos eles.

Existe algum método para encontrar todos os arquivos afetados?

    
por lumbric 15.03.2012 / 12:19

3 respostas

8

Supondo que você esteja usando a codificação utf-8 (o padrão no Ubuntu), este script deve identificar os nomes dos arquivos e renomeá-los para você.

Ele funciona usando find com codificação C (ascii) para localizar arquivos com caracteres não imprimíveis neles. Em seguida, ele tenta determinar se esses caracteres não imprimíveis são utf-8 caracteres ou não. Se não, ele mostra os nomes dos arquivos decodificados com cada uma das codificações listadas no array enc , permitindo que você selecione o que parece certo para renomeá-lo.

latin1 era comumente usado em sistemas linux antigos, e o windows-1252 é comumente usado pelo windows now adays (eu acho). iconv -l mostrará uma lista de possíveis codificações.

#!/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)
    
por geirha 15.03.2012 / 22:45
2

Tente isto:

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

Isto irá localizar todos os caracteres não-ASCII em nomes de arquivos e pastas, e ajudá-lo a encontrar os culpados culpados: P

    
por SirCharlo 15.03.2012 / 18:26
1

Comece com este comando regex find e modifique-o até encontrar apenas aqueles em que está interessado: find . | egrep [^a-zA-Z0-9_./-\s] .
Aquele acima irá encontrar nomes de arquivos que tenham um caractere não UTF-8.

    
por yossile 15.03.2012 / 13:46