Use el comando find para convertir archivos de descuento a html

17

Supongamos que tengo archivos en mi disco duro con extensiones como .md.

Quiero convertir todos esos archivos a .htmltravés findy la -execopción.

El comando para convertir un archivo markdown a html es

markdown readme.md > readme.html

Estoy tratando de usar algo como:

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

Por supuesto, lo anterior no funciona. Entonces, ¿cómo hago eso usando solo findy exec?

Abhijeet Rastogi
fuente

Respuestas:

16

Debe citar alrededor de la construcción que contiene >porque es un carácter especial de shell, como este:

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

Esto también cambiará el nombre de los archivos para que termines en foo.htmllugar de foo.md.html:

find / -name "*.md" -type f -exec sh -c 'markdown "${0}" > "${0%.md}.html"' {} \;
prisa
fuente
¿No obtienes file.md.html ahora? En lugar de file.html?
Bernhard
@rush ¿Por qué necesito {}al final en ambos comandos? Además, en el segundo comando, ¿es difícil de seguir para mí lo que sucedió? No entendí la ${0%.md}/.htmlparte.
Abhijeet Rastogi
Por cierto, acabo de comprobar. probablemente escribiste barra diagonal por error en ${0%.md}/.html.
Abhijeet Rastogi
@shadyabhi El final {}es el argumento de entrada para elsh -c cadena, y allí se accede como $0. El comando que no entiendes elimina .mdy agrega .html. Probablemente tienes razón con escapar de la.
Bernhard
@ Bernhard Gracias por su respuesta. Honestamente, supe antes que también es despojar.md y agregando, .htmlpero me gustaría saber más al respecto. ¿Me puede redirigir a un wiki / documento que explica esto?
Abhijeet Rastogi
0

La manera de lograr exactamente lo que ha escrito es usar markdownla -oopción, que especifica el nombre del archivo de salida, es decir

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

Hacerlo de esta manera evita iniciar un nuevo shell solo para ejecutar Markdown.

Desafortunadamente, como señala Bernhard, hacerlo de esta manera le da archivos nombrados en file.md.htmllugar de file.html, por lo que el enfoque de rush es más apropiado aquí.

Mikel
fuente
1
Pero, markdownno tiene una -oopción. Verifiqué dos veces antes de comentar.
Abhijeet Rastogi
markdown (1) dice que sí, pero ¿quizás tenga una versión diferente?
Mikel
1
También podrías usar pandoc -f markdown -t html -o....
Mikel
Oh, estaba usando daringfireball.net/projects/markdown y no tiene eso.
Abhijeet Rastogi