
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 find
e xargs
executar 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 xargs
e find
.
for f in ./*.htm; do pandoc -f html -t markdown "$f" -o "${f%.htm}.md"; done
Se você quiser agir recursivamente (portanto: todos .htm
os arquivos no diretório atual e todos os subdiretórios), então (assumindo bash 4+) você pode usar a globstar
opçã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 -exec
um script de find
, assim:
find . -name '*.htm' -exec ./convert-to-md.sh {} \;
O arquivo de script deve ser semelhante a este, dependendo da pandoc
linha 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 bash
có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 $0
o bash, que geralmente inclui o nome do shell script, argumentos posicionais começando em $0
.
Isso permite que você continue usando find
(mesmo com -print0
nomes xargs -0
de 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.