Um Markdown-Dateien effektiv in HTML-Dateien zu konvertieren

2939
Léo Léopold Hertz 준영

Ich habe die folgende Dateistruktur

|--folder1 | |---1.markdown |--folder2 | |---2.markdown |--folder3 | |---3.markdown ... 

Ich möchte die Markdown-Dateien in HTML-Dateien konvertieren, sodass die HTML-Dateien in jedem bestimmten Ordner erstellt werden. Zum Beispiel 1.htmlsollte bei sein folder1.

Ich kann eine Markdown-Datei mit konvertieren

markdown.py-2.6 1.markdown > 1.html 

Wir sollten also in der Lage sein, vor jeder HTML-Datei das Wort vor dem Suffix zu erhalten.

Wie können Sie viele Markdown-Dateien effektiv in ihre entsprechenden HTML-Dateien konvertieren?

1
Wenn jemand weiß, wie man mit Python dasselbe macht, würde ich mich freuen zu sehen. ** Ich bin mir nicht sicher, wie Sie dies finden können. -name "* .markdown" `in Python. ** Léo Léopold Hertz 준영 vor 14 Jahren 0

4 Antworten auf die Frage

2
jamuraa

Sie können dies mit einem kleinen Bash-Skript tun:

for i in `find . -name "*.markdown"`; do  markdown.py-2.6 $i > `dirname $i`/`basename -s .markdown $i`.html done 
Wow, ich war gerade dabei, dasselbe zu schreiben. Die HTML-Dateien müssen jedoch nicht in die Unterverzeichnisse kopiert werden. Sie müssen `cd` oder etwas anderes verwenden. jtbandes vor 14 Jahren 0
Das Skript wurde korrigiert, um die HTML-Dateien in die ursprünglichen Verzeichnisse zu kopieren, aber ich bin bei der Verwendung von dirname und basname in der gleichen Zeile. jamuraa vor 14 Jahren 0
Es ist etwas hässlich - könnten Sie stattdessen `cd \` dirname $ i \ `verwenden; markdown.py-2.6 $ i> \ `basename -s .markdown $ i \` .html`? jtbandes vor 14 Jahren 1
$ i in diesem Skript enthält den Pfadnamen. Sie müssen also cd `dirname $ i` ausführen. markdown.py-2.6 `basename $ i`>` basename -s .markdown $ i`.html jamuraa vor 14 Jahren 0
@jtbandes: Bitte lege deinen Vorschlag auf eine gesonderte Antwort. Es würde mir helfen, Ihren Code zu lesen. Léo Léopold Hertz 준영 vor 14 Jahren 1
@jamuraa: Warum hast du `.markdown` in` basename -s .markdown $ i`? Léo Léopold Hertz 준영 vor 14 Jahren 0
Das `-s .markdown` entfernt die Erweiterung .markdown, wodurch es eine 1.html-Datei anstelle von 1.markdown.html wird jamuraa vor 14 Jahren 0
2
evilsoup

Die vorhandenen bash-basierten Antworten werden bei Dateien mit Leerzeichen im Namen unterbrochen und zum Booten unnötige externe Befehle aufgerufen.

Unter der Annahme, dass bash 4+ verfügbar ist (wahrscheinlich ist es mit check bash --version), können Sie globstar für rekursives Globbing einstellen:

shopt -s globstar for f in ./**/*.markdown; do markdown.py-2.6 "$f" > "$.html"; done 

Dies kann auch mit find gemacht werden; Für absolute Kugelsicherheit sollten Sie ein Nullbyte-Trennzeichen verwenden:

find . -name '*.markdown' -print0 | while read -d $'\0' f; do markdown.py-2.6 "$f" > "$.html" done 

Dieses spezielle Problem könnte auch mit der -execOption von find gelöst werden :

find . -name '*.markdown' -exec bash -c 'markdown.py-2.6 "$0" > "$.html" '{}' \; 

Dies lässt sich jedoch nicht so einfach auf mehrzeilige Skripts erweitern.

Viel sauberer als die anderen Antworten! `find… -exec bash -c '...' {}` funktioniert auch ohne das Setzen der Trennzeichen. slhck vor 10 Jahren 1
1
quark

In bash ist es wahrscheinlich einfacher, dies zu tun (wenn Sie erst einmal die Syntax verstanden haben, sind es nur ein oder zwei Zeilen), aber für die Aufzeichnung ist dies in Python der Fall. Sie möchten die beiden Funktionen os.walk und fnmatch.fnmatch verwenden, um die gewünschten Dateien in jedem Verzeichnis zu finden. Es sieht aus wie das:

#!/usr/bin/env python  import os, sys from fnmatch import fnmatch  if len(sys.argv) != 2: print "Usage:", sys.argv[0], "<directory>" sys.exit()  markdown = # <path to markdown.py> directory = sys.argv[1]  for path, directory, files in os.walk(directory): for file in files: if fnmatch(file, "*.html"): html_file = "%s/%s" % (path, file) markdown_file = html_file.replace(".html", ".markdown") os.system("python %s %s > %s" % (markdown, markdown_file, html_file)) 

Die wichtigsten Dinge zum Mitnehmen:

  • Die os.walkFunktion durchläuft eine Verzeichnisstruktur (mit einem Generator). Es gibt drei Variablen zurück:
    • Das aktuelle Verzeichnis ( path)
    • Die Liste der Verzeichnisse im aktuellen Verzeichnis ( directories). Sie brauchen das in diesem Fall nicht.
    • Die Liste der Dateien im aktuellen Verzeichnis ( files). Sie tun müssen dies.
  • Die fnmatch.fnmatchFunktion nimmt eine Liste von Dateien und teilt Ihnen mit, ob sie mit einem Muster übereinstimmt. Dies ist ein Shell-Glob-Muster und kein regulärer Ausdruck. Sie können hier reguläre Ausdrücke verwenden, ist aber fnmatchfür einen einfachen Fall wie diesen einfacher.

Beachten Sie, dass Sie den Pfad zum Markdown-Skript angeben müssen. Noch besser wäre es, os.systemdas Modul nicht zu verwenden, sondern Markdown zu importieren und seine primäre Funktion aufzurufen. Dies wird jedoch auf Nicht-Python-Programme verallgemeinert. (Plus, ich weiß nicht genau, was diese Funktion wäre :).

1
jtbandes

Eine Modifikation der Antwort von Jamuraa:

for i in `find . -name "*.markdown"`; do pushd `dirname $i` markdown.py-2.6 $i > `basename -s .markdown $i`.html popd done 
Bitte verwenden Sie nicht 'for i in $ (ls)' oder ähnliches. Siehe [Warum Sie die Ausgabe von ls (1) nicht analysieren sollten] (http://mywiki.wooledge.org/ParsingLs) für die Gründe und [evilsoups answer] (http://superuser.com/a/605412) / 48078) für einen sichereren Ansatz. slhck vor 10 Jahren 2