Użyj polecenia find, aby przekonwertować pliki Markdown na HTML

17

Załóżmy, że mam pliki na dysku twardym posiadające rozszerzenia jako .md.

Chcę przekształcić te wszystkie pliki .htmlza pośrednictwem findtej i -execopcji.

Polecenie przekonwertowania pliku przeceny na HTML to

markdown readme.md > readme.html

Próbuję użyć czegoś takiego:

find / -name "*.md" -type f -exec markdown {} > {}.html \;

Oczywiście powyższe nie działa. Jak mam to zrobić, używając tylko findi exec?

Abhijeet Rastogi
źródło

Odpowiedzi:

16

Musisz zacytować wokół konstruktu zawierającego, >ponieważ jest to znak specjalny powłoki, taki jak ten:

find / -name "*.md" -type f -exec sh -c 'markdown "$0" > "$0.html"' {} \;

Spowoduje to również zmianę nazw plików, więc foo.htmlzamiast tego foo.md.html:

find / -name "*.md" -type f -exec sh -c 'markdown "${0}" > "${0%.md}.html"' {} \;
wysypka
źródło
Nie otrzymujesz teraz file.md.html? Zamiast pliku.html?
Bernhard
@ rush Dlaczego potrzebuję {}na końcu obu poleceń? Poza tym w drugim poleceniu trudno jest mi śledzić, co się stało? Nie zrozumiałem tej ${0%.md}/.htmlczęści.
Abhijeet Rastogi
Btw, właśnie sprawdziłem. prawdopodobnie przez pomyłkę napisałeś ukośnik do przodu ${0%.md}/.html.
Abhijeet Rastogi
@shadyabhi Końcowy {}jest argumentem wejściowym dla sh -cciągu i jest dostępny jako $0. Polecenie, którego nie rozumiesz, usuwa .mdi dodaje .html. Prawdopodobnie masz rację, uciekając przed.
Bernhard
@Bernhard Dziękujemy za odpowiedź. Szczerze mówiąc, wcześniej wiedziałem również, że to rozbiera .mdi dodaje, .htmlale chciałbym dowiedzieć się więcej na ten temat. Czy możesz przekierować mnie do wiki / dokumentu, który to wyjaśnia?
Abhijeet Rastogi
0

Sposobem na osiągnięcie dokładnie tego, co napisałeś, jest skorzystanie markdownz -oopcji, która określa nazwę pliku wyjściowego, tj

find / -name "*.md" -type f -exec markdown -o {}.html {} \;

Robiąc to w ten sposób unika się uruchamiania nowej powłoki tylko po to, by uruchomić markdown.

Niestety, jak zauważa Bernhard, zrobienie tego w ten sposób daje pliki o nazwie file.md.htmlzamiast file.html, więc podejście Rush jest bardziej odpowiednie tutaj.

Mikel
źródło
1
Ale markdownnie ma -oopcji. Sprawdziłem dwukrotnie przed komentowaniem.
Abhijeet Rastogi
markdown (1) mówi, że tak, ale może masz inną wersję?
Mikel
1
Możesz także użyć pandoc -f markdown -t html -o....
Mikel
Och, korzystałem z daringfireball.net/projects/markdown i nie ma tego.
Abhijeet Rastogi