2

У меня есть папка, полная файлов HTML:

001.htm
002.htm
003.htm
…

Я хочу запустить Pandoc на них, чтобы преобразовать их в файлы Markdown с одинаковыми именами:

001.md
002.md
003.md

Эта команда работает на одном из них:

pandoc -f html -t markdown 001.htm -o 001.md

И я хочу использовать find и xargs для автоматического запуска аналогичной команды для каждого файла в папке.

Я дошел до этого:

find *.htm | xargs -I {} -n 1 pandoc -f html -t markdown -o {}

… Который усекает каждый файл в каталоге, так что теперь я спрашиваю, прежде чем что- то сломать.

Что не так с моей командой выше, и / или каков совершенно другой / более эффективный способ сделать это?

3 ответа3

3

Мне удалось сделать это с этим 1 вкладышем. Если вы гибки в отношении xargs и find часть.

for f in ./*.htm; do pandoc -f html -t markdown "$f" -o "${f%.htm}.md"; done

Если вы хотите действовать рекурсивно (так: все файлы .htm в текущем каталоге и все подкаталоги), то (при условии bash 4+) вы можете использовать опцию оболочки globstar :

shopt -s globstar
for f in ./**/*.htm; do pandoc -f html -t markdown "$f" -o "${f%.htm}.md"; done
3

Использование {} недостаточно гибко для некоторых ситуаций. Похоже, это один из тех.

Возможный обходной путь:-exec скрипт из find , например так:

find . -name '*.htm' -exec ./convert-to-md.sh {} \;

Файл сценария должен выглядеть примерно так, в зависимости от конкретной командной строки pandoc :

#!/bin/bash
pandoc -f html -t markdown -o "${1/.htm/.md}" "${1}"

Если вы не хотите создавать и сохранять для этого файл скрипта, вы всегда можете вставить код скрипта bash :

find . -name '*.htm' | xargs -n 1 bash -c 'pandoc -f html -t markdown -o "${1/.htm/.md}" "${1}"' -

Дополнительное - в конце служит для заполнения $0 в bash, которое обычно включает имя сценария оболочки, позиционные аргументы начинаются с $0 .

Это позволяет вам продолжать использовать find(даже с -print0 и xargs -0 если вы обрабатываете странные имена файлов), но не требует создания отдельного файла.

1

Вы, кажется, пропускаете {} в команде pandoc

find . -name \*.htm | xargs -I {} -n 1 pandoc -f html -t markdown {} -o {}.md

Но тогда у вас будут файлы с именем 001.htm.md - вам придется решить, если это проблема.

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