PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme mit Sonderzeichen in Dateinamen



nobody0
21-04-2005, 21:56
Um Dateien zu verarbeiten verwende ich bisher find und pipe:

find ./ -type f -print | dupmerge

und das funktionniert auch mit Dateinamen die Klammern, Anführungsstriche usw. enthalten, aber nicht mit einigen Dateien wie dieser hier:

> ls -ilaf ...
2420359 -rwxrwxr-x 1 nobody0 users 9163 2001-08-01 00:00 ftp.lugcamp.de/chaas/1/b%FCcher/b%FCcher/books/Unix2/upt/ch09_14??tm

Das ist die Ausgabe unter SuSE 9.3 und unter Debian wird die Datei als

ch09_14\n\ntm

angezeigt; anscheinend sind da zwei newlines drin.

Das Einlesen von dupmerge wird mit

while (fgets (buf, sizeof (buf), stdin), !feof (stdin))

vorgenommen und das nachfolgende lstat auf die betreffende Datei schlägt fehl, weil deren Name als "ch09_14)" und "tm" eingelesen wird, also als zwei Dateinamen eingelesen wird.

Irgendwelche Vorschläge? :confused:

Und wo gibt's ausgefallene Dateinamen-Sammlungen, die man zum Testen nehmen kann? :confused:

SeeksTheMoon
22-04-2005, 09:25
Man kann Dateien zwar mit Sonderzeichen benennen aber empfehlenswert ist das nicht. Es ist schon übel genug wenn Leerzeichen in Dateinamen vorkommen.
Die ganzen Funktionen arbeiten mit \n, so dass man auf zwei andere Wege ausweichen muss:
a) Du arbeitest mit Verzeichnissen und lässt Dir alle Dateinamen vom Verzeichnis geben
b) Falls Du weißt wie lang die Dateinamen sind, dann kannst Du versuchen <Dateinamenlänge> Zeichen einzulesen

Ich würde es vielleicht mit Methode a) versuchen, aber leider ist die nicht plattformunabhängig, falls Du das brauchst.

nobody0
22-04-2005, 10:12
Aha, dann brauche ich Funktionen, die \0 als Trennzeichen verwenden, denn mit

find ./ -type f -print0 |

werden die Dateinamen mit \0 terminiert.
Mit
while (fgets (buf, sizeof (buf), stdin), !feof (stdin))
werden nämlich nur 0 Dateien eingelesen.