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
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.html
sollte 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?
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
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 -exec
Option 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.
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:
os.walk
Funktion durchläuft eine Verzeichnisstruktur (mit einem Generator). Es gibt drei Variablen zurück: path
)directories
). Sie brauchen das in diesem Fall nicht.files
). Sie tun müssen dies.fnmatch.fnmatch
Funktion 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 fnmatch
fü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.system
das 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 :).
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