Lorz
Anmeldungsdatum: 1. Juni 2021
Beiträge: 85
|
Hallo! Ich habe viele tex-Dateien, davon sind einige in ISO-8859-1 formatiert und einige in UTF8. Ich möchte nun per Terminalkommando alle tex-Dateien von ISO-8859-1 nach UTF8 konvertieren. Gefunden habe ich dazu
| $ iconv -f ISO-8859-15 -t UTF-8 in.txt > out.txt
|
Mir ist jetzt noch nicht klar, wie ich in dieses Kommando ergänzen muss, sodass die Konvertierung auf ein Verzeichnis und alle darin enthaltenen tex-Dateien ausgeweitet wird. Eigentlich brauche ich eine Kommandozeile für den Terminal auf dem Mac. Aber im dortigen Forum hat sich bisher leider keine Lösung ergeben. Deshalb schaue ich jetzt hier im Ubuntu-Forum, denn ich habe auch noch einen Ubuntu-Rechner mit dem ich die Konvertierung machen kann. Und/Oder vielleicht sind Kommandos je eh recht ähnlich. Freue mich sehr über Hilfe!
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12538
|
Sollte überall recht ähnlich sein: | #!/bin/sh
set -e
for f in *.txt; do
iconv -f ISO-8859-15 -t UTF-8 "$f" > "$f.new"
mv -f "$f.new" "$f" # replace the old file with the new one
done
|
|
Lorz
(Themenstarter)
Anmeldungsdatum: 1. Juni 2021
Beiträge: 85
|
Danke rklm für die schnelle Antwort! Nur um sicher zu gehen, dass ich das auch richtig verstehe - ich habe leider kein wirkliches Terminalwissen: Zeile 1: Zeigt das Verzeichnis an, in dem man sich befindet? Zeile 3: Verstehe/Kenne ich leider nicht. Zeile 5: wofür steht dort der Parameter "f"? Läuft dieser Befehl dann über alle txt-Dateien? (Sorry, mein Fehler hier sollte natürlich dann *.tex stehen).
|
Rechnungstore
Anmeldungsdatum: 18. Februar 2011
Beiträge: 157
|
Moin Lorz, Zeile 1: Ist die "shebang". Besagt dass der Code von /bin/sh ausgeführt werden soll. Zeile 3: Sorgt dafür dass das Script abbricht, sobald einer der Befehle fehlschlägt (Rückgabewert != 0) Zeile 5: "f" ist einfach nur der Name der Variable in der pro Schleifendurchlauf die Datei steht die konvertiert wird. Muss nicht unbedingt f heißen, kannst du nennen wie du willst.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12538
|
Lorz schrieb: Danke rklm für die schnelle Antwort!
Bitte! Danke Rechnungstore für die schnelle Erklärung!
Läuft dieser Befehl dann über alle txt-Dateien? (Sorry, mein Fehler hier sollte natürlich dann *.tex stehen).
Ja. Statt "*.tex" kannst Du auch einen Pfad verwenden, z.B. "/home/otto/Documents/*.tex". Oder auch mehrere.
|
Lorz
(Themenstarter)
Anmeldungsdatum: 1. Juni 2021
Beiträge: 85
|
Rechnungstore schrieb: Moin Lorz, Zeile 1: Ist die "shebang". Besagt dass der Code von /bin/sh ausgeführt werden soll. Zeile 3: Sorgt dafür dass das Script abbricht, sobald einer der Befehle fehlschlägt (Rückgabewert != 0) Zeile 5: "f" ist einfach nur der Name der Variable in der pro Schleifendurchlauf die Datei steht die konvertiert wird. Muss nicht unbedingt f heißen, kannst du nennen wie du willst.
"shebang"? Ist das so ein "Max Mustermann" Benutzername? Muss ich das auch bei mir vorher eintippen?
set -e erscheint mir nützlich. Also könnte ich jetzt konkret folgendes benutzen?
| for f in Users/Ich/Verzeichnis*.tex; do iconv -f ISO-8859-15 -t UTF-8 "$f" > "$f.new" mv -f "$f.new" "$f" done
|
So ganz verstehe ich noch nicht "$f".Bezieht sich das auf das f am Anfang? Und wofür steht das "$"-Zeichen?
Das "-f" steht ja für "from", also für das Quellformat.
Den Rest verstehe ich, glaub ich. Es gibt eine vorrübergehende Datei "geradekonvertiert.tex.new", die dann die alte ersetzt. Ich könnte es nun natürlich einfach ausprobieren und schauen, ob alles glatt läuft. Aber vielleicht trotzdem vorweg:
Was macht dieser Befehl mit einer tex-Datei, die bereits UTF8-formatiert ist? Wird diese ignoriert? Oder der Inhalt fälschlich als ISO uminterpretiert und die Datei (vielleicht sogar Fehler-erzeugend) konvertiert? Edit: Habe ne bessere Idee: In den falsch formatierten tex-Dateien steht an einer Stelle "Latin1" (statt UTF8). Ginge es auch, dass man nicht nach dem Dateityp "tex", sondern nach Dateien mit dem Inhalt "Latin1" sucht? ZB mit dem sed-Befehl? Und dann mit diesen Dateien die Konvertierung vornimmt. untere Idee kann man verwerfen, das Terminal durchsucht (zumindest nicht ohne weiteres) keine ISO-formatierten Dateien.
|
steamywindows
Anmeldungsdatum: 5. Mai 2018
Beiträge: 27
|
shebang legt fest, mit welcher Shell der folgende Code interpretiert wird (könnte z.B. #!/bin/bash sein oder #!/bin/zsh oder wie hier #!/bin/sh). f ist eine Variable, die in diesem Beispiel gefüllt wird mit Dateinamen, aus dem aktuellen oder angegebenen Verzeichnis, die auf tex enden. Die Variable könnte auch x oder i oder trallala genannt werden, das ist egal. Wichtig ist dann aber, dass später auf genau den Namen Bezug genommen wird, den die Variable hat. Dein Einzeiler wird nicht funktionieren, weil Du die Zeilenschaltungen aus dem Skript von rklm mit dem Zeichen ; ersetzen müsstest und Du bräuchtest einen kompletten Pfad. for f in /Users/Ich/Verzeichnis/*.tex; do iconv -f ISO-8859-15 -t UTF-8 "$f" > "$f.new"; mv -f "$f.new" "$f"; done Ich hätte einen Vorschlag, der prüft, ob eine Datei im ISO-Format vorliegt und nur dann konvertiert (z. B. in /home/usernamen und dem fiktiven Verzeichnis meine_texdateien):
| for texdatei in /home/username/meine_texdateien/*.tex;do test $(file "${texdatei}" | grep -c ISO) -eq 1 && iconv -f ISO-8859-15 -t UTF-8 "${texdatei}" > "${texdatei}.new";mv -f "${texdatei}.new" "${texdatei}";done
|
Es spart evtl. etwas Zeit, wenn es sehr viele Dateien sind. Eine Datei, die bereits UTF-8 ist, wird nach der Konvertierung eine UTF-8 Datei bleiben.
|
Lorz
(Themenstarter)
Anmeldungsdatum: 1. Juni 2021
Beiträge: 85
|
Hallo steamywindows, vielen Dank für Deine Unterstützung. Ich sollte wohl lieber schon im Bett liegen - finde es aber so spannend, zu schauen, ob nun die Formatierungen klappen, dass ich noch a bissl damit herumspielen musste. Hier eine Rückmeldung | for f in /Users/Ich/Verzeichnis/*.tex; do iconv -f ISO-8859-1 -t UTF-8 "$f" > "$f.new"; mv -f "$f.new" "$f"; done
|
Natürlich mit dem richtigen Pfad und noch "ISO-8859-15" ersetzt durch "ISO-8859-1", den Fehler habe ich zu Beginn hier hineingebracht.
Dieses Kommando tut was es soll - wunderbar!
Wie wirkt es sich auf bereits vorhandene UTF8-formatierte Dateien aus? Sagen es wir so: sobald sich eine UTF8-formatierte Datei im Ordner befindet, schließt sich das Terminal. Danach sind keine der anderen ISO-formatierten Dateien konvertiert. | for texdatei in /home/username/meine_texdateien/*.tex;do test $(file "${texdatei}" | grep -c ISO) -eq 1 && iconv -f ISO-8859-1 -t UTF-8 "${texdatei}" > "${texdatei}.new";mv -f "${texdatei}.new" "${texdatei}";done
|
(auch hier ISO-8859-15 –> ISO-8859-1 und mit richtigen Verzeichnisnamen)
verhält sich genauso obiger Code. Dass sich das/der Terminal schließt, liegt wahrscheinlich an "set -e"? Aber warum kommt es zu Fehlern/Abbrüchen?
|
steamywindows
Anmeldungsdatum: 5. Mai 2018
Beiträge: 27
|
Ich bin ein wenig verwirrt, über Deine Vorgehensweise. Führst Du das als Skript aus (wie von rklm empfohlen) oder als Einzeiler in einem Terminal-Programm. Und findet das unter einem Mac-OS statt oder auf Linux? Ich habe leider keine Ahnung, welche Spezialitäten ein Mac-Terminal bietet und welche Programme man da voraussetzen kann. Mein Vorschlag war eine einzige Zeile, die in ein Terminal unter ubuntu einkopiert und ausgeführt werden könnte.
|
Lorz
(Themenstarter)
Anmeldungsdatum: 1. Juni 2021
Beiträge: 85
|
Also ich poste mal die beiden Möglichkeiten, wie ich unter Linux tex.Dateien konvertiert bekomme, sofern sich keine UTF8-formatierte Dateien darin befinden. Kann sein, dass der Mehrzeiler hier falsch von mir benutzt wurde. Mit dem anderen Einzeiler klappt es genau so. Also es werden die ISO-formatierten zu UTF8-formatierten tex-Dateien, solange sich am Anfang noch keine UTF8-formierte tex-Datei im Verzeichnis befand. Wenn ich nun
| for texdatei in /home/username/meine_texdateien/*.tex;do test $(file "${texdatei}" | grep -c ISO) -eq 1 && iconv -f ISO-8859-1 -t UTF-8 "${texdatei}" > "${texdatei}.new";mv -f "${texdatei}.new" "${texdatei}";done
|
erneut ausführe - als Einzeiler und ohne "set -e" zuvor einzugeben, so bekomme ich folgende Meldung mv: Aufruf von stat für '/home/Name/Downloads/SchwingkreisKopie/ABVerzoegertesLampenleuchtenIIPH01in2022.tex.new' nicht möglich: Datei oder Verzeichnis nicht gefunden
und dies dann für jede Datei (also für das obige Verzeichnis so 60 mal).
- Bilder
|
Lorz
(Themenstarter)
Anmeldungsdatum: 1. Juni 2021
Beiträge: 85
|
Nachtrag:
Im Terminal des MacOs funktionieren die beiden Kommandos ebenfalls. Aber es kommt noch besser: Mit | for texdatei in /home/username/meine_texdateien/*.tex;do test $(file "${texdatei}" | grep -c ISO) -eq 1 && iconv -f ISO-8859-1 -t UTF-8 "${texdatei}" > "${texdatei}.new";mv -f "${texdatei}.new" "${texdatei}";done
|
bekomme ich dort zwar auch eine Fehlermeldung, wenn sich bereits mindestens eine schon utf8-formatiert-gewesene Datei dort drin befindet. JEDOCH: die restlichen zuvor ISO-formatierten Dateien sind nun UTF8-formatiert ☺ Wäre natürlich schön, wenn das auf Ubuntu auch funktioniert. Zum "doppelten" UTF8-konvertieren:
Auch bei der anderen Kommandozeile verhält sich MacOs anders: | for f in /Users/Ich/Verzeichnis/*.tex; do iconv -f ISO-8859-1 -t UTF-8 "$f" > "$f.new"; mv -f "$f.new" "$f"; done
|
bricht hier im Mac-Terminal nicht ab, sondern verändert die bereits utf8-formatierten Dateien, etwa zu Passagen wie
"Die GröÃe Spannung ist definiert als "Energie pro Ladung"' (ausführlicher: die Energie in J, die eine Ladung der GröÃe 1 C aufnimmt, wenn sie die Spannung $U$ durchläuft.). Lässt sich mit dieser Definition auf die zwischen den Platten anliegende Spannung $U$ schlieÃen?" [/mark]
|
steamywindows
Anmeldungsdatum: 5. Mai 2018
Beiträge: 27
|
Okay, da gibt es ein grundsätzliches Verständnisproblem, scheint mir. Ein Skript, so wie es ursprünglich vorgeschlagen war, sollte in eine Datei kopiert werden, die müssten dann ausführbar gemacht werden und letztlich gestartet. Dann werden alle Kommandos innerhalb des Skriptes abgearbeitet und das im besten Fall erfolgreich. Die Kommandos einzeln in einem Terminal einzugeben ist nur sehr bedingt eine gute Idee. Probier' mal folgendes (insgesamt kopieren und dann im Terminal einfügen, gefolgt von Enter-Taste - sonst nichts vorher einkopieren): | for texdatei in /home/Name/Downloads/SchwingkreisKopie/*.tex;do test $(file "${texdatei}" | grep -c ISO) -eq 1 && iconv -f ISO-8859-15 -t UTF-8 "${texdatei}" > "${texdatei}.new";mv -f "${texdatei}.new" "${texdatei}";done
|
Die Alternative wäre eine Datei mit einem Skript, wie dem folgenden: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | #!/bin/sh
Pfad="/home/Name/Downloads/SchwingkreisKopie"
set -e
for texdatei in "${Pfad}"/*.tex
do
if [ $(file "${texdatei}" | grep -c ISO) -eq 1 ]
then
echo -e "${texdatei} ist im ISO-Format und wird konvertiert."
iconv -f ISO-8859-15 -t UTF-8 "${texdatei}" > "${texdatei}.new"
mv -f "${texdatei}.new" "${texdatei}"
else
echo -e "${texdatei} ist nicht ISO-formatiert und wird in Ruhe gelassen."
fi
done
exit 0
|
Diese Zeilen müssten in eine Datei - sagen wir beispielsweise in /home/Name/konv.sh Dann ausführbar machen mit:
| chmod 755 /home/Name/konv.sh
|
Und letzlich starten mit: Name müsstest Du noch mit dem tatsächlichen Namen austauschen, aber das sollte es dann sein. HTH
|
Lorz
(Themenstarter)
Anmeldungsdatum: 1. Juni 2021
Beiträge: 85
|
@steamywindows
Also ich poste mal die beiden Möglichkeiten, wie ich unter Linux tex.Dateien konvertiert bekomme, sofern sich ausschließlich ISO-formatierte Dateien darin befinden. Kann sein, dass der Mehrzeiler hier falsch von mir benutzt wurde. Mit dem anderen Einzeiler klappt es genau so, solange sich keine steamywindows schrieb: Okay, da gibt es ein grundsätzliches Verständnisproblem, scheint mir. Ein Skript, so wie es ursprünglich vorgeschlagen war, sollte in eine Datei kopiert werden, die müssten dann ausführbar gemacht werden und letztlich gestartet. Dann werden alle Kommandos innerhalb des Skriptes abgearbeitet und das im besten Fall erfolgreich. Die Kommandos einzeln in einem Terminal einzugeben ist nur sehr bedingt eine gute Idee. Probier' mal folgendes (insgesamt kopieren und dann im Terminal einfügen, gefolgt von Enter-Taste - sonst nichts vorher einkopieren): | for texdatei in /home/Name/Downloads/SchwingkreisKopie/*.tex;do test $(file "${texdatei}" | grep -c ISO) -eq 1 && iconv -f ISO-8859-15 -t UTF-8 "${texdatei}" > "${texdatei}.new";mv -f "${texdatei}.new" "${texdatei}";done
|
Aber ist denn diese Zeile im Vergleich zu vorher verändert (aus dem ISO-8859-15 mache ich stillschweigend ein ISO-8895-1)? Ich sehe keinen Unterschied. Ein Eingabe im Terminal bringt das gleiche Resultat: Fehlermeldungen, wenn bereits UTF8-formatierte Dateien im Verzeichnis vorhanden sind und es finden dann keine Formatierungen für die restlichen ISO-Dateien statt. Mit dem Skript klappt es! (Siehe auch Bild im Anhang)
- Bilder
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12538
|
steamywindows schrieb:
| for texdatei in /home/Name/Downloads/SchwingkreisKopie/*.tex;do test $(file "${texdatei}" | grep -c ISO) -eq 1 && iconv -f ISO-8859-15 -t UTF-8 "${texdatei}" > "${texdatei}.new";mv -f "${texdatei}.new" "${texdatei}";done
|
Das kann man noch etwas schöner machen. | for texdatei in /home/Name/Downloads/SchwingkreisKopie/*.tex; do file -b --mime-encoding "${texdatei}" | fgrep -qi ISO && iconv -f ISO-8859-15 -t UTF-8 -o "${texdatei}.new" "${texdatei}"; mv -f "${texdatei}.new" "${texdatei}"; done
|
Für die Lesbarkeit: | for texdatei in /home/Name/Downloads/SchwingkreisKopie/*.tex; do
file -b --mime-encoding "${texdatei}" | fgrep -qi ISO \
&& iconv -f ISO-8859-15 -t UTF-8 -o "${texdatei}.new" "${texdatei}"
mv -f "${texdatei}.new" "${texdatei}"
done
|
Man könnte sich auch noch das erkannte Encoding merken: | for texdatei in /home/Name/Downloads/SchwingkreisKopie/*.tex; do
enc=$(file -b --mime-encoding "${texdatei}")
echo "$enc" | fgrep -qi ISO \
&& iconv -f "$enc" -t UTF-8 -o "${texdatei}.new" "${texdatei}"
mv -f "${texdatei}.new" "${texdatei}"
done
|
|
Lorz
(Themenstarter)
Anmeldungsdatum: 1. Juni 2021
Beiträge: 85
|
Danke schon mal bis hierhin! Auch an rklm für die Neuerungen, die probiere ich gleich mal aus. Vorab ne Frage zu ISO-8859-1 versus ISO-8859-15.
Hintergrund: In Tex-Studio wird "ISO-8859-1" unten angezeigt als Formatierung. Abgeschnitten ist die Infozeile nicht, denn "windows-1252" ist länger.
Vorher hatte ich mit iconv "ISO-8859-15" benutzt, weil ich das so bei stackoverflow gefunden hatte. Aber ich hatte dann Fehlermeldungen bekommen, diese ging weg, wenn ich "15" durch "1" ersetzte. Für unteres Skript habe ich mal beides probiert und stelle keinen Unterschied fest. Kann mich jemand aufklären über "den Unterschied" von ISO-8859-15 und ISO-8859-1 bzw. den Unterschied fürs Konvertieren? Und - kann man mit obigem Befehl bei der Konvertierung neben dem Verzeichnis auch noch Unterverzeichnis einbeziehen?
|