Verwenden Sie find, xargs usw., um ähnlich benannte Dateien auszugeben

878
75th Trombone

Ich habe einen Ordner mit 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 von ihnen:

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

Ich möchte einen ähnlichen Befehl für jede Datei im Ordner verwenden findund xargsautomatisch ausführen.

Ich bin soweit gekommen:

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

… Die alle Dateien im Verzeichnis abschneidet, frage ich jetzt, bevor ich wirklich etwas kaputt mache .

Was ist mit meinem obigen Befehl falsch und / oder was ist ein völlig anderer / effizienterer Weg, dies zu tun?

2

3 Antworten auf die Frage

3
Martín Canaval

Das ist mir mit diesem 1 Liner gelungen. Wenn Sie flexibel sind xargsund das findTeil.

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

Wenn Sie rekursiv handeln möchten (also alle .htmDateien im aktuellen Verzeichnis und alle Unterverzeichnisse), können Sie (unter der Annahme von bash 4+) die globstarOption shell verwenden:

shopt -s globstar for f in ./**/*.htm; do pandoc -f html -t markdown "$f" -o "$.md"; done 
+1. xargs doesn't allow you the same flexibility of filename modification. Do **not** replace `*.htm` with `$(find...)` -- filenames with spaces will be properly handled in the first case but *not* the second. glenn jackman vor 11 Jahren 2
@ glennjackman Wenn Sie nicht die Basse `$ IFS` für diesen Codeabschnitt auf '$' \ n'` setzen, dann sind Leerzeichen kein Problem - Zeilenumbrüche sind jedoch immer noch der Fall. Daniel Beck vor 11 Jahren 1
Wow, es gibt zwei oder drei neue Dinge an der Kommandozeile, die ich aus diesem Snippet lernen kann. Vielen Dank! 75th Trombone vor 11 Jahren 0
3
Daniel Beck

Die Verwendung {}ist in manchen Situationen nicht flexibel genug. Dies scheint einer von denen zu sein.

Eine mögliche Problemumgehung wäre für -execein Skript findwie folgt:

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

Die Skriptdatei sollte in Abhängigkeit von der genauen pandocBefehlszeile ähnlich aussehen :

#!/bin/bash pandoc -f html -t markdown -o "$" "$" 

Wenn Sie dafür keine Skriptdatei erstellen und speichern möchten, können Sie den Skriptcode jederzeit einbetten bash:

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

Das zusätzliche -am Ende dient zum Ausfüllen $0von bash, das normalerweise den Namen des Shell-Skripts und die positionellen Argumente enthält, die mit beginnen $0.

Dadurch können Sie die Verwendung fortsetzen find(auch wenn Sie mit -print0und xargs -0mit seltsamen Dateinamen umgehen), müssen jedoch keine separate Datei erstellen.

Findet `sowieso nicht seltsame Dateinamen? Bei IIRC gibt es nie einen guten Grund, `find… -print0 | xargs -0… ` slhck vor 11 Jahren 0
@slhck Newlines sind gültige Dateinamenkomponenten. Im Folgenden wird gezeigt, wie dies dazu führt, dass Skripts fehlschlagen: `" $ (echo -e 'foo \ nbar') "berühren; finden . -name 'foo * bar' | xargs -n 1 echo Datei: ` Daniel Beck vor 11 Jahren 0
1
glenn jackman

Ihnen scheint ein {}Befehl im Pandoc-Befehl zu fehlen

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

Aber dann haben Sie Dateien benannt 001.htm.md- Sie müssen entscheiden, ob dies ein Problem ist.