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

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

У меня есть папка, полная 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}"' -

Дополнительный аргумент -в конце служит для заполнения $0bash, который обычно включает имя скрипта оболочки, позиционные аргументы, начинающиеся с $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— вам придется решить, является ли это проблемой.

Связанный контент