Usando find, xargs, etc. para gerar arquivos com nomes semelhantes

2

Eu tenho uma pasta cheia de arquivos HTML:

001.htm
002.htm
003.htm
…

Eu quero rodar o Pandoc para convertê-los em arquivos Markdown de nome similar:

001.md
002.md
003.md

Este comando funciona em um deles:

pandoc -f html -t markdown 001.htm -o 001.md

E eu quero usar find e xargs para executar automaticamente um comando semelhante em todos os arquivos da pasta.

Cheguei até aqui:

find *.htm | xargs -I {} -n 1 pandoc -f html -t markdown -o {}

… o que trunca todos os arquivos no diretório, por isso, agora estou perguntando antes de realmente quebrar alguma coisa.

O que há de errado com meu comando acima e / ou o que é uma maneira completamente diferente / mais eficiente de fazer isso?

    
por 75th Trombone 25.01.2013 / 18:49

3 respostas

3

Eu consegui fazer isso com este 1 liner. Se você é flexível sobre a parte xargs e find .

for f in ./*.htm; do pandoc -f html -t markdown "$f" -o "${f%.htm}.md"; done

Se você quiser agir recursivamente (assim: todos os arquivos .htm no diretório atual e todos os subdiretórios), então (assumindo o bash 4+) você pode usar a opção globstar shell:

shopt -s globstar
for f in ./**/*.htm; do pandoc -f html -t markdown "$f" -o "${f%.htm}.md"; done
    
por 25.01.2013 / 19:01
3

Usar {} não é flexível o suficiente para algumas situações. Isso parece ser um desses.

Uma possível solução alternativa seria -exec de um script de find , assim:

find . -name '*.htm' -exec ./convert-to-md.sh {} \;

O arquivo de script deve ser semelhante a isso, dependendo da linha de comando exata pandoc :

#!/bin/bash
pandoc -f html -t markdown -o "${1/.htm/.md}" "${1}"

Se você não quiser criar e salvar um arquivo de script para isso, poderá sempre inserir o código de script bash :

find . -name '*.htm' | xargs -n 1 bash -c 'pandoc -f html -t markdown -o "${1/.htm/.md}" "${1}"' -

O - adicional no final serve para preencher $0 no bash, que geralmente inclui o nome do script shell, argumentos posicionais iniciando em $0 .

Isso permite que você continue usando find (mesmo com -print0 e xargs -0 se estiver lidando com nomes de arquivos estranhos), mas não requer a criação de um arquivo separado.

    
por 25.01.2013 / 20:56
1

Parece que você está perdendo um {} no comando pandoc

find . -name \*.htm | xargs -I {} -n 1 pandoc -f html -t markdown {} -o {}.md

Mas você terá arquivos com o nome 001.htm.md - você terá que decidir se isso é um problema.

    
por 25.01.2013 / 20:38