Faq/General/150/cs

Poznámka
V textu budeme uvažovat o převodu z .docx do .odt, ale syntaxe a kroky jsou stejné i pro další formáty, které LibreOffice podporuje.

Kontext
Ve Windows 10 můžeme použít příkaz soffice.exe --convert-to odt my_document.docx pro provedení převodu "my_document.docx" z formátu MS docx do formátu Open Document (odt). Funkce "--convert-to" umožňuje specifikovat množinu dokumentů s použitím zástupných znaků pro soubory. Například je možné použít *.docx, když máte balík souborů .docx, které chcete převést. Tyto soubory musí být v jedné složce.

Problém
Když však tento příkaz použijete v příkazovém řádku Windows, vůbec nefunguje. Zdá se, že všechny převody jsou spuštěny současně a protože dvě instance LibreOffice (soffice.exe) nemohou při spuštění z příkazového řádku běžet současně, proces nikdy neskončí. V nejlepším případě budete mít jeden nebo dva převedené soubory, ale v každém případě budete muset manuálně ukončit balík procesů LibreOffice, které budou v systému spuštěny (na první pohled bude procesů dvakrát tolik než je souborů).

Řešení
Pro překonání tohoto problému je jednoduché řešení použití nového subsystému Windows pro Linux Environment, který je poskytnutý MS pro Windows 10. Možná budete muset tento subsystém nainstalovat, což je celkem jednoduché, pokud budete postupovat podle dokumentace na stránce https://docs.microsoft.com/en-us/windows/wsl/install-win10.

Po instalaci budete mít přístup k docela pěknému příkazovému řádku běžícímu nad základním systémem Windows a funkce "--convert-to" bude bez problémů pracovat v synchronním módu.

Krátká ukázka

 * 1) Zjistěte si cestu k souboru soffice.exe.
 * 2) Po vytvoření cílového adresáře přejděte do adresáře, který obsahuje soubory k převodu.
 * 3) Zadejte tento příkaz:  --convert-to.odt -outdir *.docx.

Příklad
"/mnt/c/Program Files/LibreOffice 5/program/soffice.exe" --convert-to odt --outdir ./Converted_To_odt *.docx převede soubory docx z aktuálního adresáře do souborů odt do adresáře ./Converted_To_odt.

Proč?
WSL připojuje celý souborový systém sám. Syntaxe pro určení umístění souboru v adresářovém stromu se tedy liší od syntaxe systému Windows. První rozdíl je kořen adresářového stromu: Ve Windows je to C:\, ekvivalentem v bashi (bash = příkazový řádek Linuxu) je /mnt/c. Dalším rozdílem je oddělovač adresářů - ve Windows je to \, v bashi je to /. Zbývající prvidla jsou již stejná - bash podporuje stejnou znakovou sadu jako příkazový řádek Windows, podporuje i dlouhá jména souborů a jména souborů s mezerami, pokud jsou oddělovány uvozovkami (").

Jak vytvořit příkaz?
Nejjednodušší způsob je prozkoumat zástupce, kterého používáte při spouštění LibreOffice. Pravým tlačítkem na něj kliknete, z kontextové nabídky vyberete "Vlastnosti" a následně zkopírujete obsah pole "Cíl". V ukázce výše to bude "C:\Program Files\LibreOffice 5\program\soffice.exe". Poté upravte syntaxi podle pravidel bashe, jak je popsáno výše, a dostanete toto: "/mnt/c/Program Files/LibreOffice 5/program/soffice.exe" Pozor! Unix (Linux) rozlišuje velká a malá písmena, Windows ne.

A je hotovo.

Závěr
Použití příkazové řádky bash ve Windows je snadný způsob, jak převést spoustu souborů z jednoho formátu do jiného, pomocí vestavěné funkce příkazového řádku LibreOffice.

Nebo jednodušší způsob - interaktivní
LibreOffice umožňuje i jednodušší způsob konverze dokumentů - vestavěný konvertor dokumentů, jak je popsáno zde: https://help.libreoffice.org/latest/cs/text/shared/autopi/01130000.html

Můžete jej spustit z menu

Někteří uživatelé hlásili, že museli rozděli soubory do balíků po 200 souborech, protože převod více souborů někdy neproběhl v pořádku.

Dlouhý popis problému
The problem is not that "all the conversions are started simultaneously". It's simply that LibreOffice's  in fact does not support using wildcards itself, and only works on non-Windows systems because they process the wildcards in their shells (and of course, these shells also work on Windows, like with Cygwin or WSL).

What does this mean? This means that in Bash, when you send a command like, the command is first analyzed by Bash, and it finds the   there, and enumerates every file that matches the mask, puts their names into one string, and substitutes the   with something like. This is what LibreOffice sees.

Windows' cmd.exe does not do that, and sends the  to LibreOffice unmodified. LibreOffice simply tries to open the file named, and fails. That's all.

In Windows' cmd.exe, the pre-processing should be done explicitly, like this:

for %f in ("path\to\*.doc") do "C:\Program Files\LibreOffice\program\soffice" --convert-to odt "%f"

The enhancement request to implement own wildcard processing is.