2014-09-30 14 views
14

Sto provando a convertire un'intera directory da html in markdown. L'albero delle directory è piuttosto alto, quindi ci sono file annidati di due e tre livelli.Conversione di tutti i file in una cartella in md utilizzando pandoc su Mac

Nel rispondere this question, John MacFarlane suggerito utilizzando la seguente Makefile:

TXTDIR=sources 
HTMLS=$(wildcard *.html) 
MDS=$(patsubst %.html,$(TXTDIR)/%.markdown, $(HTMLS)) 

.PHONY : all 

all : $(MDS) 

$(TXTDIR) : 
    mkdir $(TXTDIR) 

$(TXTDIR)/%.markdown : %.html $(TXTDIR) 
    pandoc -f html -t markdown -s $< -o [email protected] 

Ora, questo non sembra andare dentro le sottodirectory. C'è un modo semplice per modificare questo in modo che possa elaborare l'intero albero?

Non è necessario che sia in make. Tutto quello che sto cercando è un modo per ottenere un mirror della directory iniziale in cui ogni file html viene sostituito dall'output di esecuzione di pandoc su quel file.

(ho il sospetto che qualcosa lungo these lines dovrebbe aiutare, ma sono tutt'altro che sicuro che non mi rompere le cose, se cerco di andare a esso da solo. Sono analfabeti quando si tratta di GNU make).)

+0

Se non conosci 'make', forse prova a scrivere il tuo script nella tua lingua preferita, ad es. Python o Ruby? (mi spiace non essere di maggior aiuto in questo momento) – mb21

+0

Sì, potrei semplicemente provarlo. – apc

risposta

20

Dal momento che hai menzionato non ti dispiace non utilizzando make, puoi provare bash.

ho modificato il codice da questa answer, utilizzare nella directory superiore:

find ./ -iname "*.md" -type f -exec sh -c 'pandoc "${0}" -o "${0%.md}.pdf"' {} \; 

ha funzionato quando ho provato, quindi dovrebbe funzionare per voi.

Come da richiesta Qualche idea su come specificare la cartella di output? (Usando html come il file originale e md come uscita):

find ./ -iname "*.html" -type f -exec sh -c 'pandoc "${0}" -o "./output/$(basename ${0%.html}.md)"' {} \; 

Ho testato questo e funziona per me.

Edit: Come per un commento, il {} \; quando viene utilizzato con find e l'opzione -exec viene utilizzato come, più o meno, segnaposto per il nome del file in cui dovrebbe essere. Come in esso espande i nomi dei file che si trovano nel comando. Lo \; termina lo -exec. Vedi here per ulteriori spiegazioni.

+1

Grazie. Giusto per chiarire. Per farlo fare quello che voglio (cioè prendere i file 'html' e restituire i file' md') dovrebbe essere: 'find ./ -iname" * .html "-tipo f -exec sh -c 'pandoc" $ {0} "-o" $ {0% .html} .md "'{} \;', giusto? Qualche idea su come specificare la cartella di output? (Come è appena mette il file 'md' nella stessa cartella del corrispondente' html'. – apc

+0

@apc Ho aggiornato la mia risposta. – Luke

+0

Ciò provoca il seguente errore sulla mia macchina: 'pandoc:: openFile: non esiste (Nessun file o directory) '. I file sono trovati, ma' $ {0} 'sembra essere vuoto –

1

Ecco come l'ho fatto!

files=($(find ${INPUT_FOLDER} -type f -name '*.md')) 
for item in ${files[*]} 
do 
    printf " %s\n" $item 
    install -d ${DIR}/build/$item 
    pandoc $item -f markdown -t html -o ${DIR}/build/$item.html; 
    rm -Rf ${DIR}/build/$item 
done