
У меня есть папка, полная 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 {}
…который обрезает все файлы в каталоге, поэтому теперь я спрашиваю, прежде чем яДействительносломать что-нибудь.
Что не так с моей командой выше, и/или какой есть совершенно другой/более эффективный способ сделать это?
решение1
Мне удалось сделать это с помощью этой 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
решение2
Использование {}
не является достаточно гибким для некоторых ситуаций. Похоже, это одна из таких ситуаций.
Возможным решением будет использование -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
именами файлов), но не требует создания отдельного файла.
решение3
{}
Кажется , в команде pandoc отсутствует a
find . -name \*.htm | xargs -I {} -n 1 pandoc -f html -t markdown {} -o {}.md
Но тогда у вас будут файлы с именами 001.htm.md
— вам придется решить, является ли это проблемой.