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.

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

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.


TextWrangler (darmowy wariant BBEdit) ma tę samą funkcję.
— klanomath
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.