Usar find, xargs, etc. para generar archivos con nombres similares

Usar find, xargs, etc. para generar archivos con nombres similares

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 findy xargsejecutar 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 xargsy 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 .htmlos archivos en el directorio actual y todos los subdirectorios), entonces (asumiendo bash 4+) puede usar la globstaropció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 -execun 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 pandoclí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 bashcó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 $0bash, que generalmente incluye el nombre del script de shell y argumentos posicionales que comienzan en $0.

Esto le permite seguir usando find(incluso -print0si xargs -0está 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.

información relacionada