Вы можете сделать это с помощью небольшого скрипта bash:
for i in `find . -name "*.markdown"`; do markdown.py-2.6 $i > `dirname $i`/`basename -s .markdown $i`.html done
У меня есть следующая структура файла
|--folder1 | |---1.markdown |--folder2 | |---2.markdown |--folder3 | |---3.markdown ...
Я хотел бы преобразовать файлы разметки в файлы HTML, чтобы файлы HTML создавались для каждой конкретной папки. Например, 1.html
должно быть в folder1
.
Я могу конвертировать один файл уценки
markdown.py-2.6 1.markdown > 1.html
Таким образом, мы должны каким-то образом получить слово перед суффиксом перед каждым HTML-файлом.
Как вы можете эффективно конвертировать многие файлы уценки в соответствующие им HTML-файлы?
Вы можете сделать это с помощью небольшого скрипта bash:
for i in `find . -name "*.markdown"`; do markdown.py-2.6 $i > `dirname $i`/`basename -s .markdown $i`.html done
The existing bash-based answers will break on files with spaces in their names, and call unnecessary external commands to boot.
Assuming bash 4+ is available (it probably is, check with bash --version
), you can set globstar for recursive globbing:
shopt -s globstar for f in ./**/*.markdown; do markdown.py-2.6 "$f" > "$.html"; done
This can also be done with find; for absolute bulletproof-ness, you should use a nullbyte delimiter:
find . -name '*.markdown' -print0 | while read -d $'\0' f; do markdown.py-2.6 "$f" > "$.html" done
This particular problem could also be solved using find's -exec
option, like so:
find . -name '*.markdown' -exec bash -c 'markdown.py-2.6 "$0" > "$.html" '{}' \;
However, this is not as easy to extend to multi-line scripts.
Вероятно, вам будет проще сделать это в bash (например, как только вы поймете синтаксис, это всего одна или две строки), но для справки, вот как это сделать в Python. Вы хотите использовать две функции os.walk и fnmatch.fnmatch для сопоставления файлов, которые вы хотите в каждом каталоге. Это выглядит так:
#!/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))
Основные вещи, которые нужно забрать:
os.walk
Функция пересекает структуру каталогов ( с использованием генератора). Возвращает три переменные: path
)directories
). Вам не нужно это в этом случае.files
). Вам это нужно.fnmatch.fnmatch
Функция принимает список файлов и говорит вам, если она соответствует шаблону. Это шаблон оболочки типа "glob", а не регулярное выражение. Вы можете использовать регулярные выражения здесь, но fnmatch
это проще для простого случая, подобного этому.Обратите внимание, что вам нужно указать путь к скрипту уценки. Еще лучше было бы не использовать, os.system
а вместо этого импортировать разметку модуля и вызывать его основную функцию, но это обобщает программы, не относящиеся к Python. (Плюс, я не знаю точно, что это была бы за функция :).
Модификация ответа Джамураа:
for i in `find . -name "*.markdown"`; do pushd `dirname $i` markdown.py-2.6 $i > `basename -s .markdown $i`.html popd done