Rekurencyjnie usuń wszystkie nieprawidłowe znaki z plików tekstowych na miejscu

0

Mam kilka tysięcy plików tekstowych, z których niektóre zawierają nieprawidłowe znaki UTF-8. Chcę rekurencyjnie usunąć wszystkie nieprawidłowe znaki z tych plików na miejscu.

Zdaję sobie sprawę z tego, że zadawano już wiele podobnych pytań, takich jak: jak usunąć znaki spoza UTF-8 z pliku tekstowego ale nie znalazłem takiego, który byłby zarówno rekurencyjny, jak i działający na miejscu.

pingu
źródło

Odpowiedzi:

4

Wspaniałą cechą poleceń systemu UNIX jest to, że można je łączyć. iconv nie wie, jak powtarzać w katalogach, ale find robi. Może zadzwonić iconv na każdym pliku, który widzi.

(Te polecenia konwertują wszystkie pliki w bieżącym katalogu i wszystko katalogi wewnątrz. Upewnij się, że znajdujesz się w katalogu, w którym chcesz konwertować wszystkie pliki rekurencyjnie.)

Aby zmienić wszystkie pliki z rozszerzeniem .txt:

find . -type f -name '*.txt' -print0 | 
    while IFS= read -r -d $'\0' filename; do 
        iconv -f utf-8 -t utf-8 -c "$filename" > "$filename".iconv_cleaned_utf8
        mv "$filename".iconv_cleaned_utf8 "$filename"
    done

Przypuszczam, że ten kod wymaga pewnych wyjaśnień. To co robi to:

  • find wypisuje wszystkie nazwy plików zaangażowanych plików, oddzielone bajtem null (bajt null jest jedynym niepoprawnym znakiem ścieżki do pliku)
  • grzmotnąć read s nazwy plików i przechodzą przez nie
  • iconv konwertuje plik do pliku tymczasowego z dodatkowym rozszerzeniem
  • my mv plik tymczasowy, aby zastąpić oryginalny plik.

Jeśli mają różne rozszerzenia (dotyczy to wszystkich plików w bieżącym katalogu), usuń -name *.txt

To trochę czystsze, jeśli masz sponge narzędzie z moreutils, ale nie jest instalowany domyślnie.

find . -type f -name '*.txt' -print0 | 
    while IFS= read -r -d $'\0' filename; do 
        iconv -f utf-8 -t utf-8 -c "$filename" | sponge "$filename"
    done
0942v8653
źródło
Dzięki @ 0942v8653, uruchomiłem twoje polecenie, było dużo wyjścia do terminala, jednak nie było żadnych edycji plików, które zawierają niedozwolone znaki.
pingu
Przepraszam, jeszcze tego nie testowałem, okazuje się, że iconv pisze do terminala. Zaktualizuje moją odpowiedź.
0942v8653
@pingu: edytowane.
0942v8653
0

Może to nie odpowiadać na całe pytanie, ale od wielu lat jestem szczęśliwym użytkownikiem BBEdit (przynajmniej Pre-OSX ...). Używam go do hackowania HTML i okazjonalnego otwierania plików, których nie mogę zrozumieć.

Posiada tę fajną funkcję o nazwie Zap Gremlins, która zasadniczo usuwa całą masę dziwnych i nie-ASCII znaków z dowolnego pliku. Co brzmi bardzo podobnie do tego, co musisz zrobić.

I jest masowo skryptowalny, ale nie darmowy. Może być warto zbadać aby zobaczyć, czy zrobi to, co chcesz.

Steve Chambers
źródło
TextWrangler (darmowy wariant BBEdit) ma tę samą funkcję.
klanomath