Wuwejův zápisník

Hromadné přejmenování a změna kódování souborů

05.02.2020 23:03, Wu | počítače | komentáře -

Tohle jsou asi zase jen poznámky pro mě, vy jako čtenáři se ke zdrojovým souborům blogu patrně nedostanete. Na druhou stranu, dílčí kroky (hromadné přejmenování, oprava konců řádků, změna kódování) z konverze by se mohly hodit i vám, pochopitelně pokud používáte linuxové nástroje.

O co tedy jde – při vytvoření generátoru blogu jsem všechny soubory pojmenoval s příponou txt, a protože jsem byl na Win XP, vznikaly samozřejmě s kódováním windows-1250. Dokud jsem Windows používal, bylo to v pořádku, po přechodu na Linux se situace trochu zkomplikovala. Musel jsem si pro editaci blogu vyhradit jEdit, v něm nastavit jako výchozí kódování to z windows a ještě si ho asociovat s příponou txt. Tím jsem si ji ale efektivně znehodnotil, protože od té doby se mi jEdit s codepage 1250 otevíral pro jakýkoliv textový soubor.

Nehledě na to, že Windows-1250 nedokáže zapsat všechny znaky, které bych mohl potřebovat.

Rozhodl jsem se to tedy narovnat. Generátor blogu je masivně konfigurovatelný, můžu si určit jak příponu zdrojových souborů, tak jejich kódování, ale co s daty?

Hromadné přejmenování souborů

Nejprve bylo třeba soubory hromadně přejmenovat. To umí balíček renameutils, takže:

sudo dnf install renameutils

Následně jsem podle návodů sestavil kombinací vyhledání (find) a přejmenování:

find -type f -name '*.txt' | rename "s/\.txt/\.blog/"

A ke svému překvapení zjistil, že to nefunguje. Dostával jsem hlášku "rename: málo argumentů". Teprve po několika desítkách minut jsem dohledal, že pro Fedoru se musí použít příkaz prename (!)

find -type f -name '*.txt' | prename "s/\.txt/\.blog/"

Pak už to prošlo. Ještě jsem si překonfiguroval generátor

#[INPUT]
#input.dateTimeFormatPattern=dd.MM.yyyy HH:mm
#input.charset=windows-1250
input.fileSuffix=blog

zkusil vygenerovat celý blog – a vše bylo ok!

Hromadná změna konců řádků

Linux (a linuxové editory) používá pro konce řádků jenom znak LF (na rozdíl od windows, kde je to kombinace CR-LF), potřeboval jsem tedy provést v souborech i změnu konců. To zase umí balík dos2unix.

sudo dnf install dos2unix

Ten ovšem potřebuje cestu k souboru v parametru, takže spojení příkazů přes pipe mi nepomůže. Naštěstí find umožňuje pro každý nalezený soubor spustit příkaz a cestu mu předat do parametru

find -type f -name '*.blog' -exec dos2unix {} \;

Hromadná změna kódování

Předchozí kroky byla ovšem jen rozcvička před tím hlavním – překódováním všech souborů z Windows-1250 do UTF-8. Našel jsem si, že potřebuji program iconv s tímto použitím:

iconv -f WINDOWS-1250 -t utf-8 puvodni_soubor.txt > zkonvertovany_soubor.txt

Vypisování konvertovaného obsahu na výstup je nepříjemné, nakonec jsem ale – naštěstí – přece jen našel potřebný parametr -o a mohl to tak propojit s find.

find -type f -name '*.blog' -exec iconv -f WINDOWS-1250 -t utf-8 {} -o {} \;
iconv: nepovolená vstupní sekvence na pozici 29692
iconv: nepovolená vstupní sekvence na pozici 3647

Árgh, dvě selhání – ale v kterém souboru? Nejprve jsem si myslel, že takové přeskočí, nechá je nezměněné a tudíž budou mít staré datum. Jenže vyhledání souborů nenašlo nic, takže je zjevně nepřeskočil.

find -type f -name '*.blog' -mtime +30

Nedalo se dělat nic jiného než vybalit zálohu a zkusit to znovu a lépe (s --verbose pro větší upovídanost):

find -type f -name '*.blog' -exec iconv --verbose -f WINDOWS-1250 -t utf-8 {} -o {} \;

Jenže! Bylo to upovídané tolik, že se mi výstup nevešel do bufferu terminálu a na výpisy z chybných souborů už jsem se nedostal. Inu, do třetice, s přesměrováním logu do souboru:

find -type f -name '*.blog' -exec iconv --verbose -f WINDOWS-1250 -t utf-8 {} -o {} \; &>out.txt

Konečně jsem se dostal ke zdroji problémů; jedno byl zkušební soubor, kde opakované konverze vedly ke zkáze, druhý byl skutečný článek, kde byly problematické znaky, něco od čtenáře. Po manuální opravě znaků už konverze proběhla dobře.

Nakonec jsem si zase přenastavil blog generátor:

#[INPUT]
#input.dateTimeFormatPattern=dd.MM.yyyy HH:mm
input.charset=UTF-8
input.fileSuffix=blog

MIME typ

Pak jsem si ještě chvíli hrál s nastavením MIME typů v Linuxu. Pozoroval jsem totiž divné chování – jakmile jsem pro příponu blog nastavil jedit, použil se i pro příponu txt. A naopak. Jako by byly nějak spojené, přestože je to úplně jiná přípona.

Řešení bylo nastavit si custom mime file type (dělal jsem to ve svém profilu, hlavně kvůli tomu, aby se mi to samo zazálohovalo s celým profilem, jinak by to bylo v /usr/share).

vi ~/.local/share/mime/packages/blogtext.xml

<?xml version="1.0"?>
<mime-info xmlns='http://www.freedesktop.org/standards/shared-mime-info'>
  <mime-type type="application/blogtext">
    <comment>blog text file</comment>
    <glob pattern="*.blog"/>
    <icon name="blog"/>
  </mime-type>
</mime-info>

update-mime-database ~/.local/share/mime

Jenom ikonu mi to ignoruje, ať dělám co dělám (viz), ale to vem čert.

12345
1580940180000

Informace

Kontakt

Google search

Témata

Kategorie

Archiv

STRÁNKY ARCHIVOVÁNY NÁRODNÍ KNIHOVNOU ČR

CBDB.cz – Databáze knih a spisovatelů, knihy online