
Ich habe einen Ordner voller HTML-Dateien:
001.htm
002.htm
003.htm
…
Ich möchte Pandoc auf ihnen ausführen, um sie in ähnlich benannte Markdown-Dateien zu konvertieren:
001.md
002.md
003.md
Dieser Befehl funktioniert bei einem davon:
pandoc -f html -t markdown 001.htm -o 001.md
Und ich möchte einen ähnlichen find
Befehl xargs
automatisch für jede Datei im Ordner ausführen.
Ich bin soweit gekommen:
find *.htm | xargs -I {} -n 1 pandoc -f html -t markdown -o {}
…wodurch jede Datei im Verzeichnis abgeschnitten wird, also frage ich jetzt, bevor ichWirklichkaputt machen.
Was ist falsch an meinem obigen Befehl und/oder wie kann ich das auf eine völlig andere/effizientere Art und Weise tun?
Antwort1
Das ist mir mit diesem 1-Zeilen-Text gelungen. Wenn Sie beim „ xargs
und“ find
-Teil flexibel sind.
for f in ./*.htm; do pandoc -f html -t markdown "$f" -o "${f%.htm}.md"; done
Wenn Sie rekursiv vorgehen möchten (also alle .htm
Dateien im aktuellen Verzeichnis und allen Unterverzeichnissen), können Sie (vorausgesetzt Bash 4+) die folgende globstar
Shell-Option verwenden:
shopt -s globstar
for f in ./**/*.htm; do pandoc -f html -t markdown "$f" -o "${f%.htm}.md"; done
Antwort2
In manchen Situationen ist die Verwendung {}
nicht flexibel genug. Dies scheint eine davon zu sein.
Eine mögliche Problemumgehung wäre, -exec
ein Skript von zu verwenden find
, etwa so:
find . -name '*.htm' -exec ./convert-to-md.sh {} \;
Die Skriptdatei sollte je nach genauer pandoc
Befehlszeile ungefähr wie folgt aussehen:
#!/bin/bash
pandoc -f html -t markdown -o "${1/.htm/.md}" "${1}"
Wenn Sie hierfür keine Skriptdatei erstellen und speichern möchten, können Sie den bash
Skriptcode jederzeit einbinden:
find . -name '*.htm' | xargs -n 1 bash -c 'pandoc -f html -t markdown -o "${1/.htm/.md}" "${1}"' -
Der Zusatz -
am Ende dient dazu, $0
in der Bash, der in der Regel den Namen des Shell-Skripts enthält, Positionsargumente ab anzugeben $0
.
Dies ermöglicht Ihnen die weitere Verwendung find
(auch wenn Sie mit -print0
ungewöhnlichen xargs -0
Dateinamen arbeiten), erfordert jedoch nicht die Erstellung einer separaten Datei.
Antwort3
{}
Im Pandoc-Befehl fehlt anscheinend ein
find . -name \*.htm | xargs -I {} -n 1 pandoc -f html -t markdown {} -o {}.md
Aber dann haben Sie Dateien mit dem Namen 001.htm.md
– Sie müssen entscheiden, ob das ein Problem ist.