Dateinamen nach Regeln virtuell kürzen
Schön langsam komme ich auf den Geschmack bei der Shellprogrammierung :-) Diesesmal könnte es aber geschwindikgeitskritisch werden und daher frage ich lieber vorher, bevor ich es mir zu ineffizient überlege. Vorbemerkung: Mein MP3-Autoplayer kann "mehr" bzw. ist schneller, wenn Directories und Dateinamen bestimmten Kriterien entsprechen. Nun möchte ich mir ein Script schreiben, das mit Links eine virtuelle Struktur aller mp3-Dateien erstellt, die ursprünglichen Dateinamen aber nicht verändert, sodass ich beim Brennen als Quelle die Links mit den gekürzten Namen angebe, anstatt der Originale. Der Datei- bzw. Verzeichnisname sollte in der Regel eindeutig sein und kann durchaus "kryptisch" sein. Der Player zeigt ja die ID3-Tags an. Sollte es einmal unerwarteterweise mit 8 Zeichen nicht eindeutig sein, dann "darf" das mkisofs -iso-level reparieren. Verzeichnisse müssen also mit einer zweistelligen Zahl beginnen und sollen nicht länger als 8 Zeichen sein, also zB 01DIRMP3, 02DIRMP3 .. 99DIRMP3. Damit kann man dann über die Stationstasten die ersten 12 CDs direkt anspringen. Mit welchem Programm extrahiert man am effizientesten die Stellen 3-8 eines Directories? cut wäre vielleicht eine Möglichkeit, da nach den ersten beiden Stellen immer ein Leerzeich folgt. Vermutlich gibt es da mehrere Lösungen. Das Script würde in einer Schleife mit dem Zähler i laufen. Wie gebe ich die Zahl i bei Einerstellen _2-stellig_ mit einer 0 vorangestellt aus, um daraus den ersten Teil des Namens zu kreieren? Dateinamen sollen ebenfalls nur 8 Zeichen haben und dürfen mit keiner Zahl beginnen. Meine Dateinamen beginnen aber mit einer zweistelligen Titelnummer. Daher habe ich mir zur Eindeutigkeit überlegt, dass aus den ersten beiden Zeichen (zB 01) die Zeichen "A_" werden sollen, aus "02" "B_", usw. im Alfabet. Kann man das irgendwie mit dem ASCII-Code lösen? Man könnte ja die beiden ersten Stellen extrahieren und 64 dazuzählen (A ist ASCII 65) und den erhaltenen Wert wieder in einen Buchstaben wandeln. Wie wandle ich den Dateinamen komplett in Groß- bzw. Kleinbuchstaben um und überlässt das nicht mkisofs? Ich weiß noch nicht was ich haben will, da ich mir erst überlegen muß, zu welchen anderen Playern die CD noch kompatibel sein soll bzw. was die benötigen. Die Originaldateien enthalten Leerzeichen und nach jedem Leerzeichen folgt ein Großbuchstabe. Fürs erste wäre es das Mal. Danke für euere Hilfe. Al
* Am Die, 30 Sep 2003 schrieb Al Bogner:
Schön langsam komme ich auf den Geschmack bei der Shellprogrammierung :-)
Schön!
Mit welchem Programm extrahiert man am effizientesten die Stellen 3-8 eines Directories? cut wäre vielleicht eine Möglichkeit, da nach den ersten beiden Stellen immer ein Leerzeich folgt. Vermutlich gibt es da mehrere Lösungen.
cut -c
Das Script würde in einer Schleife mit dem Zähler i laufen. Wie gebe ich die Zahl i bei Einerstellen _2-stellig_ mit einer 0 vorangestellt aus, um daraus den ersten Teil des Namens zu kreieren?
printf
Dateinamen sollen ebenfalls nur 8 Zeichen haben und dürfen mit keiner Zahl beginnen. Meine Dateinamen beginnen aber mit einer zweistelligen Titelnummer. Daher habe ich mir zur Eindeutigkeit überlegt, dass aus den ersten beiden Zeichen (zB 01) die Zeichen "A_" werden sollen, aus "02" "B_", usw. im Alfabet. Kann man das irgendwie mit dem ASCII-Code lösen? Man könnte ja die beiden ersten Stellen extrahieren und 64 dazuzählen (A ist ASCII 65) und den erhaltenen Wert wieder in einen Buchstaben wandeln.
echo -e `\065` druckt Dir das Zeichen mit Octal-Code 65, was natürlich nicht richtig hilft...aber vielleicht kommt man da mit od weiter...
Wie wandle ich den Dateinamen komplett in Groß- bzw. Kleinbuchstaben um und überlässt das nicht mkisofs? Ich weiß noch nicht was ich haben will, da ich mir erst überlegen muß, zu welchen anderen Playern die CD noch kompatibel sein soll bzw. was die benötigen. Die Originaldateien enthalten Leerzeichen und nach jedem Leerzeichen folgt ein Großbuchstabe.
Mit tr Gruß Christoph -- Christoph Maurer - Tux#194235 - christoph-maurer at gmx.de
Am Dienstag, 30. September 2003 18:19 schrieb Christoph Maurer:
* Am Die, 30 Sep 2003 schrieb Al Bogner:
Mit welchem Programm extrahiert man am effizientesten die Stellen 3-8 eines Directories? cut wäre vielleicht eine Möglichkeit, da nach den ersten beiden Stellen immer ein Leerzeich folgt. Vermutlich gibt es da mehrere Lösungen.
cut -c
Ganz komme ich mit der Syntax noch nicht klar, die man bzw. Infopage zu cut ist ja nicht sehr ausführlich :-) Ich suche Beispiele zu cut. URL? cut -c3-8 test.txt > output.txt macht zwar das was ich will. Wie wende ich nun cut ohne Datei, sondern mit einer Variablen an? Wie entferne ich die letzten 4 Zeichen bzw. wie schreibe ich die Anzahl der Zeichen einer Variable in eine andere Variable? Al
Hallo, Am Wed, 01 Oct 2003, Al Bogner schrieb:
Am Dienstag, 30. September 2003 18:19 schrieb Christoph Maurer:
* Am Die, 30 Sep 2003 schrieb Al Bogner:
Mit welchem Programm extrahiert man am effizientesten die Stellen 3-8 eines Directories? cut wäre vielleicht eine Möglichkeit, da nach den ersten beiden Stellen immer ein Leerzeich folgt. Vermutlich gibt es da mehrere Lösungen.
cut -c
Ganz komme ich mit der Syntax noch nicht klar, die man bzw. Infopage zu cut ist ja nicht sehr ausführlich :-) Ich suche Beispiele zu cut. URL?
cut -c3-8 test.txt > output.txt macht zwar das was ich will. Wie wende ich nun cut ohne Datei, sondern mit einer Variablen an?
VAR2="`echo \"$VAR1\" | cut -c3-8`" (awk -> 'var2=substr(var1, 3, 5);')
Wie entferne ich die letzten 4 Zeichen bzw. wie schreibe ich die Anzahl der Zeichen einer Variable in eine andere Variable?
numchars=`echo "$VAR1" | wc -c` start=$[NUMCHARS - 4] echo "$VAR1" | cut -c${start}-${numchars} Wenn du nur die Extension "abklemmen" willst, dann ist es besser basename oder sed zu verwenden: echo "$VAR1" | sed 's/\.[^.]*$//' [awk: gsub/split usw... da muss man evtl. diese Umwege garnicht anwenden.] -dnh -- And the pattern continues. You could give up Lent for Lent one year, you could give up giving up Lent for Lent the next year... Just make sure to stop before the deity vanishes in a puff of logic. -- Steed in asr
Am Mittwoch, 1. Oktober 2003 00:09 schrieb Al Bogner:
Am Dienstag, 30. September 2003 18:19 schrieb Christoph Maurer:
* Am Die, 30 Sep 2003 schrieb Al Bogner:
Mit welchem Programm extrahiert man am effizientesten die Stellen 3-8 eines Directories? cut wäre vielleicht eine Möglichkeit, da nach den ersten beiden Stellen immer ein Leerzeich folgt. Vermutlich gibt es da mehrere Lösungen.
cut -c
Ganz komme ich mit der Syntax noch nicht klar, die man bzw. Infopage zu cut ist ja nicht sehr ausführlich :-) Ich suche Beispiele zu cut. URL?
Wie bitte? Was ist Dir denn an der Man-Page nicht ausführlich genug? Da steht doch alles drin! Was verstehst Du denn daran nicht? Was Du allerdings nicht erwarten kannst, sind Erläuterungen, wie Du cut in Shell-Scripts benutzen kannst. Das ist Shell-Handwerkzeug.
cut -c3-8 test.txt > output.txt macht zwar das was ich will. Wie wende ich nun cut ohne Datei, sondern mit einer Variablen an?
man bash *SCNR* Du solltest Dich mal im Bereich *Grundlagen der Shell-Programmierung* umgucken, da gibt es tonnenweise Doku. teil=`echo $variable | cut -c3-8`
Wie entferne ich die letzten 4 Zeichen bzw. wie schreibe ich die Anzahl der Zeichen einer Variable in eine andere Variable?
man cut man wc man sed Wovon willst Du denn die letzten 4 Zeichen entfernen? Wenn Du die Länge der Augangsvariablen weisst: teilvar=`echo $variable | cut -c1-n` wobei n das 5-letzte Zeichen ist. Wenn Du die Länge der Variablen nicht weisst: teilvar=`echo $variable | sed 's/\(.*\)....$/\1/'` Die Länge: laenge=`echo $variable | wc -c` Und schau Dir zur Funktion der Kommandos die Man-Pages mal bitte _richtig_ an. Jan
Hallo, Am Wed, 01 Oct 2003, Jan Trippler schrieb:
teil=`echo $variable | cut -c3-8`
*PATSCH* Da komprimiert das 'echo' evtl. Leerzeichen/Tabs in $variable zu je einem Leerzeichen... $ v="b a"; t=`echo $v | cut -c1-19`; echo "$t" b a $ v="b a"; t="`echo $v | cut -c1-19`"; echo "$t" b a $ v="b a"; t=`echo "$v" | cut -c1-19`; echo $t b a $ v="b a"; t=`echo "$v" | cut -c1-19`; echo "$t" ## [1] b a $ v="b a"; t="`echo \"$v\" | cut -c1-19`"; echo $t b a Einzig richtig[2] ist (WIE IMMER!!!) nur folgendes: $ v="b a"; t="`echo \"$v\" | cut -c1-19`"; echo "$t" b a ## ^! ^^! ^^! ^! ^! ^! _Jedes_ durch ein '^!' gekennzeichnetes '"' _muss_ gesetzt werden (ggfs. als '\"' geschuetzt)!!! Also wirklich Jan! *seufz* -dnh [1] diese Version faellt aber in anderen (nichtmal exotischen!) Situationen auf die Schnauze! Ist aber immerhin die "zweitbeste". [2] und selbst das faellt u.U. ('"' in $v?) noch auf die Schnauze, vertraegt aber sehr viel mehr als alle anderen moeglichen Varianten. -- 44: Verdeckter Fehler Siemens hat mitentwickelt. (Jörg Pechau)
Am Mittwoch, 1. Oktober 2003 04:24 schrieb David Haller: [...]
Einzig richtig[2] ist (WIE IMMER!!!) nur folgendes:
$ v="b a"; t="`echo \"$v\" | cut -c1-19`"; echo "$t" b a ## ^! ^^! ^^! ^! ^! ^!
_Jedes_ durch ein '^!' gekennzeichnetes '"' _muss_ gesetzt werden (ggfs. als '\"' geschuetzt)!!!
Also wirklich Jan! *seufz*
Im Prinzip richtig - aber: Wenn ich mich recht an das Originalposting erinnere, ging es um Verzeichnisnamen, die an diesen Stellen explizit _keine_ Leerzeichen hatten. Jan
Hallo, Am Tue, 30 Sep 2003, Al Bogner schrieb:
Schön langsam komme ich auf den Geschmack bei der Shellprogrammierung :-)
*g*
Diesesmal könnte es aber geschwindikgeitskritisch werden und daher frage ich lieber vorher, bevor ich es mir zu ineffizient überlege. [..] Verzeichnisse müssen also mit einer zweistelligen Zahl beginnen und sollen nicht länger als 8 Zeichen sein, also zB 01DIRMP3, 02DIRMP3 .. 99DIRMP3. Damit kann man dann über die Stationstasten die ersten 12 CDs direkt anspringen.
Mit welchem Programm extrahiert man am effizientesten die Stellen 3-8 eines Directories? cut wäre vielleicht eine Möglichkeit, da nach den ersten beiden Stellen immer ein Leerzeich folgt. Vermutlich gibt es da mehrere Lösungen.
cut ist da schon gut. Oder substr in awk.
Das Script würde in einer Schleife mit dem Zähler i laufen. Wie gebe ich die Zahl i bei Einerstellen _2-stellig_ mit einer 0 vorangestellt aus, um daraus den ersten Teil des Namens zu kreieren?
man 1 printf. Oder awk printf.
Dateinamen sollen ebenfalls nur 8 Zeichen haben und dürfen mit keiner Zahl beginnen. Meine Dateinamen beginnen aber mit einer zweistelligen Titelnummer. Daher habe ich mir zur Eindeutigkeit überlegt, dass aus den ersten beiden Zeichen (zB 01) die Zeichen "A_" werden sollen, aus "02" "B_", usw. im Alfabet. Kann man das irgendwie mit dem ASCII-Code lösen? Man könnte ja die beiden ersten Stellen extrahieren und 64 dazuzählen (A ist ASCII 65) und den erhaltenen Wert wieder in einen Buchstaben wandeln.
Jep, allerdings macht printf(1) das nicht. In awk: $ awk 'BEGIN{i=1; while(i < 10) { printf "%c", i+64; i++; } printf "\n"; }' ABCDEFGHI
Wie wandle ich den Dateinamen komplett in Groß- bzw. Kleinbuchstaben um und überlässt das nicht mkisofs?
tr '[[:lower:]]' '[[:upper:]]' awk: tolower() / toupper()
Ich weiß noch nicht was ich haben will, da ich mir erst überlegen muß, zu welchen anderen Playern die CD noch kompatibel sein soll bzw. was die benötigen. Die Originaldateien enthalten Leerzeichen und nach jedem Leerzeichen folgt ein Großbuchstabe.
Leerzeichen und andere Sonderzeichen wuerde ich rauswerfen. -dnh -- Du sollst nicht mit der 42 rumschmeissen, du Nasenbär. Jetzt hättest du sie fast kaputt gemacht. Das ist so etwas wie unsere Bibel. Verschrotte lieber deine 666. Diese Zahl ist Satanswerk. [WoKo in dag°]
participants (4)
-
Al Bogner
-
Christoph Maurer
-
David Haller
-
Jan.Trippler@t-online.de