Usando find, xargs, etc. para gerar arquivos com nomes semelhantes

Usando find, xargs, etc. para gerar arquivos com nomes semelhantes

Eu tenho uma pasta cheia de arquivos HTML:

001.htm
002.htm
003.htm

Quero executar o Pandoc neles para convertê-los em arquivos Markdown com nomes semelhantes:

001.md
002.md
003.md

Este comando funciona em um deles:

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

E quero usar finde xargsexecutar automaticamente um comando semelhante em cada arquivo da pasta.

Cheguei até aqui:

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

…que trunca todos os arquivos do diretório, então agora estou perguntando antes derealmentequebrar alguma coisa.

O que há de errado com meu comando acima e/ou qual é uma maneira completamente diferente/mais eficiente de fazer isso?

Responder1

Consegui fazer isso com este 1 forro. Se você for flexível quanto à parte xargse find.

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

Se você quiser agir recursivamente (portanto: todos .htmos arquivos no diretório atual e todos os subdiretórios), então (assumindo bash 4+) você pode usar a globstaropção shell:

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

Responder2

O uso {}não é flexível o suficiente para algumas situações. Este parece ser um desses.

Uma possível solução alternativa seria -execum script de find, assim:

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

O arquivo de script deve ser semelhante a este, dependendo da pandoclinha de comando exata:

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

Se você não quiser criar e salvar um arquivo de script para isso, você pode incorporar o bashcódigo do script:

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

O adicional -no final serve para preencher $0o bash, que geralmente inclui o nome do shell script, argumentos posicionais começando em $0.

Isso permite que você continue usando find(mesmo com -print0nomes xargs -0de arquivos estranhos), mas não requer a criação de um arquivo separado.

Responder3

Parece que está faltando um {}no comando pandoc

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

Mas então você terá arquivos nomeados 001.htm.md- você terá que decidir se isso é um problema.

informação relacionada