Mam folder pełen plików HTML:
001.htm
002.htm
003.htm
…
Chcę uruchomić na nich Pandoc, aby przekonwertować je na pliki Markdown o podobnych nazwach:
001.md
002.md
003.md
To polecenie działa na jednym z nich:
pandoc -f html -t markdown 001.htm -o 001.md
Chcę użyć find
i xargs
automatycznie uruchomić podobne polecenie na każdym pliku w folderze.
Dotarłem tak daleko:
find *.htm | xargs -I {} -n 1 pandoc -f html -t markdown -o {}
... który obcina wszystkie pliki w katalogu, więc teraz pytam, zanim naprawdę złamać coś.
Co jest złego w moim poleceniu powyżej i / lub jaki jest zupełnie inny / bardziej wydajny sposób na zrobienie tego?
*.htm
z$(find...)
- nazwy plików ze spacjami zostaną prawidłowo obsługiwane w pierwszym przypadku, ale nie drugi.$IFS
do$'\n'
do tej części kodu, w którym nie są problemem obowiązuje Case - newlines nadal są jednak.Używanie
{}
nie jest wystarczająco elastyczne w niektórych sytuacjach. To wydaje się być jednym z nich.Możliwym obejściem może być
-exec
skrypt zfind
:Plik skryptu powinien wyglądać podobnie do tego, w zależności od dokładnego
pandoc
wiersza poleceń:Jeśli nie chcesz do tego tworzyć i zapisywać pliku skryptu, zawsze możesz wstawić
bash
kod skryptu:Dodatkowy
-
na końcu służy do wypełnienia$0
bash, który zwykle zawiera nazwę skryptu powłoki, argumenty pozycyjne zaczynające się od$0
.To pozwala zachować przy użyciu
find
(nawet-print0
ixargs -0
jeśli jesteś obsługi dziwnych nazw plików), ale nie wymaga stworzenia osobnego pliku.źródło
find
radzi sobie z dziwnymi nazwami plików? IIRC nigdy nie ma dobrego powodufind … -print0 | xargs -0 …
touch "$( echo -e 'foo\nbar' )" ; find . -name 'foo*bar' | xargs -n 1 echo File:
Wygląda na to, że brakuje
{}
ci polecenia pandocAle wtedy będziesz mieć nazwy plików
001.htm.md
- będziesz musiał zdecydować, czy to jest problem.źródło