Use o comando find para converter arquivos de remarcação para html

17

Vamos supor que eu tenha arquivos no meu disco rígido com extensões como .md.

Eu quero converter todos esses arquivos para .htmlatravés finde a -execopção.

O comando para converter um arquivo de remarcação para html é

markdown readme.md > readme.html

Estou tentando usar algo como:

find / -name "*.md" -type f -exec markdown {} > {}.html \;

Obviamente, o acima não funciona. Então, como faço isso usando apenas finde exec?

Abhijeet Rastogi
fonte

Respostas:

16

Você precisa citar a construção que contém >porque é um caractere especial do shell, assim:

find / -name "*.md" -type f -exec sh -c 'markdown "$0" > "$0.html"' {} \;

Isso também renomeia os arquivos para que você termine em foo.htmlvez de foo.md.html:

find / -name "*.md" -type f -exec sh -c 'markdown "${0}" > "${0%.md}.html"' {} \;
pressa
fonte
Você não consegue o arquivo.md.html agora? Em vez de file.html?
Bernhard
@rush Por que preciso {}no final dos dois comandos? Além disso, no segundo comando, é difícil seguir para mim o que aconteceu? Eu não entendi a ${0%.md}/.htmlparte.
Abhijeet Rastogi
Btw, acabei de verificar. você provavelmente escreveu uma barra por engano ${0%.md}/.html.
Abhijeet Rastogi
@shadyabhi O final {}é o argumento de entrada para a sh -cstring e é acessado como $0. O comando que você não entende tiras .mde adiciona .html. Provavelmente, você está certo ao escapar do.
Bernhard '
@ Bernhard Obrigado pela sua resposta. Sinceramente, eu sabia anteriormente também que isso está se desdobrando .mde acrescentando, .htmlmas gostaria de saber mais sobre isso. Você pode me redirecionar para um wiki / documento que explica isso?
Abhijeet Rastogi
0

A maneira de conseguir exatamente o que você escreveu é usar markdowna -oopção 's' , que especifica o nome do arquivo de saída, ou seja,

find / -name "*.md" -type f -exec markdown -o {}.html {} \;

Fazer dessa maneira evita iniciar um novo shell apenas para executar a remarcação.

Infelizmente, como Bernhard aponta, fazer dessa maneira fornece arquivos nomeados em file.md.htmlvez de file.html, portanto, a abordagem do rush é mais apropriada aqui.

Mikel
fonte
1
Mas, markdownnão tem uma -oopção. Eu verifiquei duas vezes antes de comentar.
Abhijeet Rastogi
markdown (1) diz que sim, mas talvez você tenha uma versão diferente?
Mikel
1
Você também pode usar pandoc -f markdown -t html -o....
Mikel
Ohk, eu estava usando daringfireball.net/projects/markdown e não tem isso.
Abhijeet Rastogi