Verwenden von find, xargs usw. zur Ausgabe ähnlich benannter Dateien

Verwenden von find, xargs usw. zur Ausgabe ähnlich benannter Dateien

Ich habe einen Ordner voller HTML-Dateien:

001.htm
002.htm
003.htm

Ich möchte Pandoc auf ihnen ausführen, um sie in ähnlich benannte Markdown-Dateien zu konvertieren:

001.md
002.md
003.md

Dieser Befehl funktioniert bei einem davon:

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

Und ich möchte einen ähnlichen findBefehl xargsautomatisch für jede Datei im Ordner ausführen.

Ich bin soweit gekommen:

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

…wodurch jede Datei im Verzeichnis abgeschnitten wird, also frage ich jetzt, bevor ichWirklichkaputt machen.

Was ist falsch an meinem obigen Befehl und/oder wie kann ich das auf eine völlig andere/effizientere Art und Weise tun?

Antwort1

Das ist mir mit diesem 1-Zeilen-Text gelungen. Wenn Sie beim „ xargsund“ find-Teil flexibel sind.

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

Wenn Sie rekursiv vorgehen möchten (also alle .htmDateien im aktuellen Verzeichnis und allen Unterverzeichnissen), können Sie (vorausgesetzt Bash 4+) die folgende globstarShell-Option verwenden:

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

Antwort2

In manchen Situationen ist die Verwendung {}nicht flexibel genug. Dies scheint eine davon zu sein.

Eine mögliche Problemumgehung wäre, -execein Skript von zu verwenden find, etwa so:

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

Die Skriptdatei sollte je nach genauer pandocBefehlszeile ungefähr wie folgt aussehen:

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

Wenn Sie hierfür keine Skriptdatei erstellen und speichern möchten, können Sie den bashSkriptcode jederzeit einbinden:

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

Der Zusatz -am Ende dient dazu, $0in der Bash, der in der Regel den Namen des Shell-Skripts enthält, Positionsargumente ab anzugeben $0.

Dies ermöglicht Ihnen die weitere Verwendung find(auch wenn Sie mit -print0ungewöhnlichen xargs -0Dateinamen arbeiten), erfordert jedoch nicht die Erstellung einer separaten Datei.

Antwort3

{}Im Pandoc-Befehl fehlt anscheinend ein

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

Aber dann haben Sie Dateien mit dem Namen 001.htm.md– Sie müssen entscheiden, ob das ein Problem ist.

verwandte Informationen