
Tengo una carpeta llena de archivos HTML:
001.htm
002.htm
003.htm
…
Quiero ejecutar Pandoc en ellos para convertirlos en archivos Markdown con nombres similares:
001.md
002.md
003.md
Este comando funciona en uno de ellos:
pandoc -f html -t markdown 001.htm -o 001.md
Y quiero usar find
y xargs
ejecutar automáticamente un comando similar en cada archivo de la carpeta.
Llegué hasta esto:
find *.htm | xargs -I {} -n 1 pandoc -f html -t markdown -o {}
...lo que trunca todos los archivos del directorio, así que ahora pregunto antes deen realidadromper algo.
¿Qué hay de malo en mi comando anterior y/o cuál es una forma completamente diferente/más eficiente de hacer esto?
Respuesta1
Logré hacer eso con este 1 liner. Si es flexible con la parte xargs
y find
.
for f in ./*.htm; do pandoc -f html -t markdown "$f" -o "${f%.htm}.md"; done
Si desea actuar de forma recursiva (es decir, todos .htm
los archivos en el directorio actual y todos los subdirectorios), entonces (asumiendo bash 4+) puede usar la globstar
opción de shell:
shopt -s globstar
for f in ./**/*.htm; do pandoc -f html -t markdown "$f" -o "${f%.htm}.md"; done
Respuesta2
El uso {}
no es lo suficientemente flexible para algunas situaciones. Este parece ser uno de esos.
Una posible solución sería utilizar -exec
un script de find
, así:
find . -name '*.htm' -exec ./convert-to-md.sh {} \;
El archivo de script debería verse similar a este, dependiendo de la pandoc
línea de comando exacta:
#!/bin/bash
pandoc -f html -t markdown -o "${1/.htm/.md}" "${1}"
Si no desea crear y guardar un archivo de secuencia de comandos para esto, siempre puede insertar el bash
código de secuencia de comandos:
find . -name '*.htm' | xargs -n 1 bash -c 'pandoc -f html -t markdown -o "${1/.htm/.md}" "${1}"' -
El adicional -
al final sirve para completar $0
bash, que generalmente incluye el nombre del script de shell y argumentos posicionales que comienzan en $0
.
Esto le permite seguir usando find
(incluso -print0
si xargs -0
está manejando nombres de archivos extraños), pero no requiere la creación de un archivo separado.
Respuesta3
Parece que te falta un {}
comando pandoc
find . -name \*.htm | xargs -I {} -n 1 pandoc -f html -t markdown {} -o {}.md
Pero luego tendrás archivos con nombre 001.htm.md
; tendrás que decidir si esto es un problema.