1

У меня есть следующая структура файла

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

Я хотел бы преобразовать файлы разметки в файлы HTML, чтобы файлы HTML создавались для каждой конкретной папки. Например, 1.html должен быть в folder1 .

Я могу конвертировать один файл уценки

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

Таким образом, мы должны каким-то образом получить слово перед суффиксом перед каждым HTML-файлом.

Как вы можете эффективно конвертировать многие файлы уценки в соответствующие им HTML-файлы?

4 ответа4

2

Вы можете сделать это с помощью небольшого скрипта bash:

for i in `find . -name "*.markdown"`; do 
  markdown.py-2.6 $i > `dirname $i`/`basename -s .markdown $i`.html
done
2

Существующие ответы на основе bash будут разбиты на файлы с пробелами в их именах и вызовут ненужные внешние команды для загрузки.

Предполагая, что bash 4+ доступен (это возможно, проверьте с помощью bash --version), вы можете установить globstar для рекурсивного сглаживания:

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

Это также можно сделать с помощью find; для абсолютной пуленепробиваемости вы должны использовать нулевой разделитель:

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

Эту конкретную проблему также можно решить с помощью параметра find -exec , например, так:

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

Однако это не так просто распространить на многострочные сценарии.

1

Вероятно, вам будет проще сделать это в 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. (Плюс, я не знаю точно, что это была бы за функция :).

1

Модификация ответа Джамураа:

for i in `find . -name "*.markdown"`; do
  pushd `dirname $i`
  markdown.py-2.6 $i > `basename -s .markdown $i`.html
  popd
done

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .