2014-09-30 11 views
14

Tôi đang cố chuyển đổi toàn bộ thư mục từ html thành markdown. Cây thư mục khá cao, vì vậy có các tệp lồng nhau hai và ba cấp độ.Chuyển đổi tất cả các tệp trong một thư mục sang md bằng cách sử dụng pandoc trên Mac

Trong trả lời this question, John MacFarlane đề nghị sử dụng các Makefile sau:

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] 

Bây giờ, điều này dường như không đi vào bên trong thư mục con. Có cách nào dễ dàng để sửa đổi điều này để nó sẽ xử lý toàn bộ cây?

Tôi không cần số này ở số make. Tất cả tôi đang tìm kiếm là một cách để nhận được một tấm gương của thư mục ban đầu nơi mỗi tập tin html được thay thế bằng đầu ra của chạy pandoc trên tập tin đó.

(Tôi nghi ngờ điều gì đó dọc theo these lines sẽ giúp ích, nhưng tôi tự tin rằng tôi sẽ không phá vỡ mọi thứ nếu tôi cố gắng tự mình làm. Tôi không biết chữ này khi nói đến GNU make).)

+0

Nếu bạn không biết 'make', có thể bạn chỉ cần viết tập lệnh của riêng mình bằng ngôn ngữ yêu thích, ví dụ: Python hay Ruby? (xin lỗi vì không được giúp đỡ nhiều hơn bây giờ) – mb21

+0

Vâng, tôi chỉ có thể thử thay vào đó. – apc

Trả lời

20

Vì bạn đã đề cập bạn không nhớ không sử dụng make, bạn có thể thử bash.

tôi sửa đổi mã từ answer này, sử dụng trong thư mục cha:

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

Nó làm việc khi tôi thử nghiệm nó, vì vậy nó sẽ làm việc cho bạn.

Theo yêu cầu Bất kỳ ý tưởng nào về cách chỉ định thư mục đầu ra? (Sử dụng html như file gốc và md như đầu ra):

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

Tôi đã thử nghiệm này và nó làm việc cho tôi.

Edit: Theo nhận xét thì {} \; khi được sử dụng với find và tùy chọn -exec được sử dụng như một, nhiều hơn hoặc ít hơn, giữ chỗ cho nơi tên tập tin nên được. Như trong nó mở rộng các tên tập tin tìm thấy được đặt trong lệnh. \; kết thúc -exec. Xem here để được giải thích thêm.

+1

Cảm ơn. Chỉ cần làm rõ. Để có được nó để làm những gì tôi muốn (viz. Có 'html' tập tin và đầu ra' md' tập tin) nó phải là: 'find ./ -iname" * .html "-type f -exec sh -c 'pandoc" $ {0} "-o" $ {0% .html} .md "'{} \;', phải không? Bất kỳ ý tưởng làm thế nào để xác định thư mục đầu ra? (Vì nó chỉ đặt tập tin 'md' trong cùng một thư mục với tập tin' html' tương ứng. – apc

+0

@apc Tôi đã cập nhật câu trả lời. – Luke

+0

Điều này dẫn đến lỗi sau trên máy của tôi: 'pandoc:: openFile: không tồn tại (Không có tập tin hoặc thư mục nào) 'Các tập tin được tìm thấy, nhưng' $ {0} 'dường như trống. –

1

Đây là cách tôi đã làm!

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 
Các vấn đề liên quan