Mehrere Dateien Formatierung konvertieren

Status
Für weitere Antworten geschlossen.

Lorzel

Aktives Mitglied
Thread Starter
Dabei seit
01.06.2021
Beiträge
538
Reaktionspunkte
69
Hallo!

Ich habe einen ganzen Haufen tex-Dateien. Einige sind UTF8-formatiert (das ist gut), einige sind ISO-formatiert (Latin1) (das ist schlecht).
Ich würde nun mit einem Kommando für den Terminal die Dateien Ordner-spezifisch und Dateityp-spezifisch (nur die tex-Dateien) von ISO-8859-1 nach UTF8 konvertieren.

Kann mir jemand solch einen Befehl formulieren?
 
Tante Google erzählt mir ne ganze Menge solcher Sachen:
How To Write Bash Shell Loop Over Set of Files - nixCraft.png
https://www.cyberciti.biz/faq/bash-loop-over-file/
 
  • Gefällt mir
Reaktionen: win2mac
Schon chatgpt gefragt?
Sonst lies halt die man pages von find und iconv.
 
  • Gefällt mir
Reaktionen: dg2rbf
OK, hier etwas konkreter:
Code:
$ iconv -f UTF-8 -t ISO-8859-15 in.txt > out.txt
Ich finde zB obiges Beispiel. Ich versteh soviel, dass hier die Konvertierungsrichtung verkehrt herum für mich ist - OK, kriege ich geändert. Und, dass sie sich auf txt-Files und nicht auf tex-Files bezieht. Krieg ich auch geändert.

Jedoch kriege ich es ohne Erfahrungen leider nicht hin, diesen Befehl auf einen ganzen Ordner auszuweiten. Also wie pflege ich dort ein Verzeichnis ein, wäre meine Frage.
Weiter habe ich Bedenken, eine bereits UTF8-formatierte Datei (ausversehen) erneut zu formatieren, dazu habe ich bereits gelesen, dass dies Chaos geben kann. Mir ist bei obigem Befehl nicht klar, wie er sich diesbezüglich auswirkt.
Wenn ich wüsste, ich den Befehl auf ein Verzeichnis (Lege ich dann zum Testen an) eingrenze, so könnte ich meine Bedenken (experimentell) überprüfen.
Habe ich gemacht. Ist einfach zu viel für mich und mir zu gefährlich. Ich habe mir auch ein Buch über UNIX gekauft und darin gestern ne Stunde gelesen. Aber auch das reicht noch nicht, um zu wissen, was ich konkret eintippen muss. Ich hätte nichts dagegen, grundsätzlich mehr Plan davon zu bekommen. Aber im Moment würde ich gern das ganze auf mein obiges Problem reduzieren. Und dann dort lieber rückwärts, anhand des fertigen Befehls verstehen, wozu die einzelnen Kommandos dienen.
 
Habe ich gemacht. Ist einfach zu viel für mich und mir zu gefährlich. Ich habe mir auch ein Buch über UNIX gekauft und darin gestern ne Stunde gelesen. Aber auch das reicht noch nicht, um zu wissen, was ich konkret eintippen muss.

Das ist zumindest der erste Schritt.

Aber abtippen wird dir nichts bringen. Und nur 1 Stunde lesen auch nichts. Und jemand der sich auskennt, wird sich auch hüten, dir hier was zu schreiben was du nur abtippen musst. Alleine deswegen, weil nicht bekannt ist, wie deine Verezichnsisstruktur aufgebaut ist, wie dein Namensschema ist, wo du die Ergebnisse liegen ahst, ob du Backusp ahst oder welche erstellen willst.....

Die grundsätzlcihe Lösung steht in #2

Das Wissen steht dazu in deinem Buch, wie #2 funktioniert. Und in man iconv steht, wie der Befehl zu verwenden ist. Der Rest liegt bei dir. Ich werde jedenfalls nach kürzlichen Erfahrungen hier im Forum mit Tipps für Terminalscripte an unbedarfte User sehr, sehr zurückhaltend sein, auch wenn ich deine Lösung sicher hin kriege. So schwer ist das nicht. Wenn du mir explizit bestätigst, dass du dich mit Bash oder zsh, dem Bewegen in den directories, dem Sprachgebrauch, wildcards, quoting und pipes für dich nicht nur englische Wörter sind, helfe ich gerne weiter, sonst nicht.

Sorry. Ich werde nicht mehr stundelang erklären, was welche Begriffe zu bedeuten haben und buchstabenweise etwas vorgeben.
 
  • Gefällt mir
Reaktionen: win2mac und dg2rbf
was ich konkret eintippen muss.

Was du konkret eintippen musst, musst du selbst wissen. Idealerweise, nachdem du verstanden hast, was das so tut.

Wenn du dich blind und ohne Verstand auf konkrete Anweisungen aus einem anonymen Internet-Forum verlässt, könnte dir z.B. sowas passieren:

https://www.macuser.de/threads/hilfe-bezueglich-root.917363/page-7#post-11830141

--------------------
PS: Das oben Geschriebene gilt gleichermaßen und noch viel mehr für das hochmoderne Geplapper von sogenannten "KI"-Plauder-Robotern.
 
  • Gefällt mir
Reaktionen: dg2rbf
Naja, so naiv und eigenverantwortungslos gehe ich sicher nicht mit Hinweisen um. Und ich erwarte auch nicht einen "Eintipp-fertigen"-Befehl, ich muss das ja mindestens an meine Verzeichnisnamen anpassen.
Wonach ich suche ist in etwa:

Kommando für konvertieren (iconv scheint geeignet) + Option dies auf ein bestimmtes Verzeichnis anzuwenden + Option dies nur auf einen bestimmten Dateityp anzuwenden + eventuell die Option bzw. das Wissen, dass kein Schaden angerichtet wird, wenn eine bereits UTF8-formatierte Datei erfasst wird

Mit cd kann ich zwar das Verzeichnis auswählen, ich würde mir dieses Schritt nur gerne sparen, es kompakter haben wollen.

Freue mich weiter über inhaltliche Unterstützung.
 
for f in ./*.c; do echo "Processing $f file..."; done
Was du konkret eintippen musst, musst du selbst wissen. Idealerweise, nachdem du verstanden hast, was das so tut.

Wenn du dich blind und ohne Verstand auf konkrete Anweisungen aus einem anonymen Internet-Forum verlässt, könnte dir z.B. sowas passieren:

https://www.macuser.de/threads/hilfe-bezueglich-root.917363/page-7#post-11830141

--------------------
PS: Das oben Geschriebene gilt gleichermaßen und noch viel mehr für das hochmoderne Geplapper von sogenannten "KI"-Plauder-Robotern.

Zu Deinem Link fällt mir dieser Sketch ein:

Annegret parkt auf einem Parkplatz und möchte beim Pförtner Karl einen Parkschein kaufen (ja ganz Oldschool, kein Parkautomat).

Annegret: Guten Tag, ich benötige einen Parkschein für 2 h.
Karl: Warum wollen Sie denn überhaupt hier parken? Sind sie sicher, dass sie hier richtig sind?
Annegret: Ja, ich will hier im Schwimmbad für 2 h schwimmen und dies ist der Parkplatz vom Schwimmbad.
Karl: Und Sie sind sicher, dass 2 h reichen? Warum sind Sie überhaupt mit dem Auto gekommen? Hätten Sie nicht auch umweltfreundlicher mit der Straßenbahn kommen können? Und auch sicherer - sie sind sich bewusst, dass Sie bei jeder Autofahrt andere Menschen gefährden?
Annegret: Sie mögen recht haben, leider wohne ich zu weit weg, ansonsten mache ich tatsächlich vieles mit dem Rad. ... und ich würde eigentlich jetzt gern ins Schwimmbad und bräuchte einen Parkschein.
Karl: Sicherheitsfragen interessieren Sie also nicht? Ich muss sagen, das finde ich ganz schön verantwortungslos von Ihnen. Ich hoffe, mit Ihrem Wagen ist wenigstens alles in Ordnung - ich sehe, sie haben nur bis zum Mai nächsten Jahres TüV - ich hoffe, Sie kümmern sich rechtzeitig um einen Termin.
Annegret: Ja, sicher, ICH WÜRDE JETZT ABER ENDLICH GERN INS SCHWIMMBAD!
Karl: Mann, Sie sind aber unfreundlich! Also so jemanden soll ich einen Parkschein verkaufen. Wie wäre es mal mit ein bisschen Nettigkeit und konstruktivem Umgang miteinander! Aber das ist Ihnen wahrscheinlich völlig egal, wie sie Ihre Mitmenschen behandeln. Sie bräuchten wirklich mal eine Therapie. Sie haben eine ganz negative Ausstrahlung und wirken sehr gehetzt. Und noch dazu ist Ihnen die Sicherheit Ihrer Mitmenschen völlig egal. Und Sie wissen noch nicht mal, wie lange Sie überhaupt parken wollen. An Ihrer Stelle würde ich mich wirklich erst mal um grundlegende Dinge in Leben kümmern. And so on...
;-)

Nun ist der Threadstarter dort im weiteren Verlauf sicher nicht so ein Unschuldslamm wie meine ausgedachte Annegret. Aber Karl und ein Großteil der Antwortenden: this is a match!

Daher meine Bitte: Ich will keine Annegret sein. Wer mir nicht auf das Thema antworten möchte, braucht das nicht. Das ist ja alles freiwillig hier. Aber wenn - ich habe nicht nach Lebenshilfe, sondern einem Kommando für den Terminal gefragt. Und über Antworten dazu freue ich mich sehr und gebe auch gern an anderer Stelle was zurück, wenn ich denn kompetent genug dazu bin.
 
for f in ./*.c; do echo "Processing $f file..."; done

Lieber Computer!
Ich möchte bitte, dass du für jede Datei in diesem Ordner, deren Name auf .c endet, folgende Aktion ausführst:
schreibe auf den Bildschirm den Namen der Datei und ein bisschen Deko drumherum
Vielen Dank für deine Hilfe.


Und, lieber Computer, weil du mir bis hierher so lieb geholfen hast, habe ich jetzt verstanden, wie man mit dir sprechen muss und kann dir auch meinen anderen, größeren Wunsch mitteilen.
 
Ich persönlich finde
find -iname \*.tex -exec iconv -f -t {} > {}utf.tex \;
eleganter als eine Schleife.
Muss man aber eh noch finetunen.
 
  • Gefällt mir
Reaktionen: ruerueka
Danke @MrChad !
Code:
for f in ./*.c; do echo "Processing $f file..."; done

OK, ich versuche das mal zu deuten:
Also wofür "f" steht ist mir schon mal nicht klar. Ich sehe keine Definition/Beschränkung für f. Bei Schleifen kenne ich sonst zB "for f from 1 to 10 do(...)".
Ist "./*.c" eine Möglichkeit Pfad und Dateityp anzugeben? Also etwa Users/Ich/Documents/*.tex ?
"echo" habe ich schon mal gelesen als Kommando oder Teil eines Kommandos, bedeutet das dann einfach eine Ausgabe? Aber was ist mit "Processing $f file..."; gemeint?
Sorry, da werde ich erst mal so schnell schlau draus.
 
Ich persönlich finde
find -iname \*.tex -exec iconv -f -t {} > {}utf.tex \;
eleganter als eine Schleife.
Muss man aber eh noch finetunen.
Danke an @oneOeight
Auch hier versuche ich mal mein Glück:
"-iname \*tex" ist dies die Stelle, wo ich einen Verzeichnispfad und den betreffenden Dateityp angebe? Also a la Post vorher: "Users/Ich/Documents/*.tex" einfügen kann? Und warum ist der Slash andersherum "\" als bei MrChad?
"-exec" das klingt nach execute, also grob:
"Wenn Du (Computer) Dateien am Ort -iname findest vom Typ tex, dann führe iconv aus. -f steht für from, -t steht für to, also Zielformat."
In der ersten geschweiften Klammen steht dann (wahrscheinlich-?) das Quellformat und in der zweiten geschweiften Klammer das Ausgabeformat? Oder etwa der Filename? (hoffentlich nicht, die wollt ich ja nicht alle händisch eintragen). Woför ist dann noch utf.tex gut?

Was würde konkret passieren, wenn ich dieses Kommando in den Terminal tippe?
find -iname Users/Ich/Documents \*.tex -exec iconv -f -t {ISO-8859-15} > {UTF8}utf.tex \;
Edit: Naja, mit hoher Sicherheit nix. Aber wahrscheinlich wird deutlich, wo für mich hier die Schwierigkeit, die Syntax adäquat zu ergänzen. Wenn ich mir dazu eine Anleitung durchlese und genau solche Fragen nicht beantwortet bekomme, erscheint es mir unmöglich.
 
Du kriegst eine Fehlermeldung.
Den Pfad gibt man an andere Stelle ein, das \ ist zum Escapen des *, die geschweifte Klammer ist der Platzhalter für die gefundene Datei.
Also ich denke du bist besser mit einer GUI App aufgehoben als im Terminal.
 
Du kriegst eine Fehlermeldung.
Den Pfad gibt man an andere Stelle ein, das \ ist zum Escapen des *, die geschweifte Klammer ist der Platzhalter für die gefundene Datei.
Also ich denke du bist besser mit einer GUI App aufgehoben als im Terminal.
Puh, wieder umsatteln. Nee, ich will ja gern den Terminal benutzen.
Ich brauche halt nur Vorlage, die ich verstehe. Das hat hier im Forum schon zweidrei Mal geklappt:
zB hier: https://www.macuser.de/threads/auto...tinhalten-die-enthalten.905231/#post-11843979

Warum sollte es nicht noch mal so gehen?

Und was meinst mit Platzhalter für die gefundene Datei? Wird also mit utf.tex an die konvertierte Datei eine Endung drangehängt, damit man erkennt, dass diese konvertiert wurde? Dann bräuchte ich jetzt nur noch ne Möglichkeit, die Verzeichnisse einzubringen. An welcher Stelle kann man denn den Pfad einsetzen? Ich wollte, wie gesagt, nicht mit cd jedes Verzeichnis einzeln aufrufen müssen.
 
Sorry, da werde ich erst mal so schnell schlau draus.
So, jetzt ist endgültig Schluss.

Ich habe allergrößtes Verständnis für @lisanet und schließe mich ihrem Kommentar von oben an:
Sorry. Ich werde nicht mehr stundelang erklären, was welche Begriffe zu bedeuten haben und buchstabenweise etwas vorgeben.
https://www.macuser.de/threads/mehrere-dateien-formatierung-konvertieren.918115/#post-11844137
 
  • Gefällt mir
Reaktionen: dg2rbf
Du schaffst es doch nicht mal die einfachen Parameter zu ersetzen, obwohl die schon dabei standen im anderen Beispiel.
-f und -t.

wenn du
find . -name
machst, sucht der ab dem aktuellen Verzeichnis alle Unterverzeichnisse ab.
Der Punkt steht auf der Shell für das aktuelle Verzeichnis bei Pfaden.
Wenn du einen Pfad einsetzen willst, dann ersetz den Punkt damit.
 
  • Gefällt mir
Reaktionen: dg2rbf
Du schaffst es doch nicht mal die einfachen Parameter zu ersetzen, obwohl die schon dabei standen im anderen Beispiel.
-f und -t.

wenn du
find . -name
machst, sucht der ab dem aktuellen Verzeichnis alle Unterverzeichnisse ab.
Der Punkt steht auf der Shell für das aktuelle Verzeichnis bei Pfaden.
Wenn du einen Pfad einsetzen willst, dann ersetz den Punkt damit.
Dh mit
Code:
find Users/Ich/Documents -name \*.tex -exec iconv -f -t {} > {}utf.tex \;
könnte es klappen😃?
oder
Code:
find Users/Ich/Documents -name \*.tex -exec iconv ISO-8859-15 UTF-8 {} > {}utf.tex \;
oder
Code:
find Users/Ich/Documents -name \*.tex -exec iconv -f UTF-8 -t ISO-8859-15 {} > {}utf.tex \;
?


Und wie genau sieht dann die Ausgabedatei aus? also Rechenweg.tex wird dann Rechenweg.texutf.tex oder Rechenweg.tex.utf.tex oder nur Rechenwegutf.tex?
 
Du willst doch von ISO nach UTF und nicht umgekehrt. F steht für from und t für to.
Vor Users fehlt ein /
Sonst müsste die letzte Version es tun.
 
  • Gefällt mir
Reaktionen: dg2rbf
Du willst doch von ISO nach UTF und nicht umgekehrt.
Vor Users fehlt ein /
Sonst müsste die letzte Version es tun.
Oh ja, da habe ich es verdreht.
Ich probiere es also mit
Code:
find /Users/Ich/Documents -name \*.tex -exec iconv -f  ISO-8859-15 -t UTF-8 {} > {}utf.tex \;

Ergebnis:
Die Datei ist inhaltlich leicht verändert. In der Präambel taucht "\documentclass[" normalerweise einmal, ganz am Anfang, auf. Jetzt taucht "\documentclass[" zweimal am Anfang und zwei mal am Ende auf. Die Konsole TexStudio beanstandet dies. Nachdem entfernen der zu vielen "\documentclass[" lässt sich Datei ebenfalls nicht mehr kompilieren, weder mit Latin1 und ISO, noch mit UTF8 :-(
Die Mutterdatei funktioniert hingegen tadellos.
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben Unten