Tenho vários arquivos markdown em minha pasta que gostaria de converter para html com pandoc.
O comando que eu normalmente uso é
pandoc Atten.md -f markdown -t html --css pandoc.css -o Atten.html
onde Atten.md
é o nome de um arquivo markdown típico. No entanto, gostaria de iterar todos os arquivos e converter .md em .html conforme feito acima. Como faço isso no bash ou no zsh?
Com
find
:Deve funcionar em Bash, Zsh e muitos outros shells. O único trabalho do shell externo é executar
find
com argumentos adequados.Esta versão gera um único
sh
para processar tantos arquivos quanto possível (maissh
processos serão gerados, se necessário):Notas:
… -exec pandoc … -o {}.html {} \;
provavelmente funcionaria. "Provavelmente" porque o POSIX requerfind
a substituição de um arquivo{}
. É uma "cortesia" dafind
implementação que você usa, se algo mais for substituído (como{}.html
ou a segunda aparição de{}
).-execdir
em vez de-exec
seria melhor, mas não é POSIX.-execdir
nos permitiria usar./"$1"
em vez de"$1"
(respectivamente:./"$f"
em vez de"$f"
) para evitar que seja interpretado porpandoc
como uma opção. Outra abordagem é,--
mas não sei sepandoc
a suporta. Eu acho que no seu caso"$1"
não pode expandir para nada começando com-
porque deve começar compath/to/dir
, e sepath/to/dir
começasse com-
então seria mal interpretado porfind
em primeiro lugar. Em geral, embora essa preocupação seja legítima.Na
pandoc
invocação, movi o operando para o final apenas por causa do meu gosto pela ordem mais comum decommand -options operands
.A solução é recursiva. Para torná-lo não recursivo, especifique
-maxdepth 1
. Se o seufind
não for compatível-maxdepth
, estude isso ou descartefind
e deixe o shell externo iterar sobre os arquivos:Notas específicas para o código acima:
cd
funcionar sem afetar o shell atual.cd
falhar por qualquer motivo, o restante não será executado. Esta é uma boa prática../*.md
em vez de simples*.md
impede que"$f"
seja interpretado como uma opção posteriormente../.*.md
é adicionado porque./*.md
não corresponde a dotfiles.[ -f "$f" ]
é prevenirpandoc
diretórios, arquivos especiais e outros;pandoc
inexistente./*.md
(ou./.*.md
) quando nada corresponde ao padrão.Zsh é um pouco diferente. O código deve funcionar
sh
e, como um subshell é útil de qualquer maneira, não faria muita diferença se você chamassesh
explicitamente de qualquer shell são:Você deve usar
find
e seu-exec
(veja man find ):Ou talvez
-execdir
.Você pode iterar o arquivo com um for: