• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[Tipp] Sonderzeichen in Dateinamen

Gute Erfahrungen im Umgang mit Sonderzeichen in Filenamen habe ich
gesammelt, indem zunächst Alles streng als Text behandelt wird:

Code:
#!/bin/bash
find ./ -name "*" -type f >Liste
echo -n "" >Vliste; echo -n "" >Fliste
a=$( cat Liste | wc -l )
for ((i=1; ${i}<=${a}; i++)) do
   echo -en "\rVerifiziere Filename ${i} von ${a}... "
   f="$( head -${i} Liste | tail -1 )"
   if test -e "${f}"; then
      echo "${f}" >>Vliste
      # Hier ggf. weiterverarbeiten.
   else
      echo "${f}" >>Fliste
   fi
done
echo "$( cat Fliste | wc -l ) unbearbeitbare Filenamen gefunden."


Erklärung:

Besser als der ls-Befehl ist der find-Befehl mit sicheren Optionen.
Unterverzeichnisse werden dann mit durchsucht und es landen nur
Filenamen ( keine Dirs ) im Text - pro Zeile ein Filename.

Die scheinbar umständlich formulierte for-Schleife stellt sicher,
dass die Liste zeilenweise abgearbeitet wird: wichtig.

In der resultierenden 'Vliste' sind jetzt nur noch tatsächlich von hier
aus ansprechbare Dateinamen gelistet, sie wurden alle einzeln mittels
'test -e' verifiziert. Das verifizierte File kann hier auch oder nur
weiterverarbeitet werden, z.B. mit:

Code:
if test "$( echo "${f}" | grep -iE "eric[^a-z]*clapton.*\.(mp3|wav)" )"; then
   echo "${f}" >>EricClapton.pl
fi

Unbearbeitbare Files, bzw. deren 'zu schräge Dateinamen', landen in der
'Fliste'. Wer hier einen Eintrag findet, veröffentlicht diesen bitte für
mich in diesem Foreneintag.

Ich habe diese Technik schon in diversen Mp3-Sammlungen, die wohl
den Overkill in Sachen 'schräge Dateinamen' darstellen, getestet.

Bitte nervt mich nicht mit anderen Schreibweisen ( geschw. Klammern u.s.w. ).
Ich bleibe bei dieser bewährten und für mich gut lesbaren Weise.

Ach ja, möchte jemand einen Skript ( 56 Zeilen ), der Gedanken lesen kann ?
 
A

Anonymous

Gast
Kleine Ergänzung und Denkanstoß.
Was bei der Behandlung von Dateinamen sehr gerne übersehen wird:

Leerzeichen am Anfang oder Ende des Dateinamens sowie mögliche Zeilensprünge im Dateinamen. Was in Scripten oft Probleme bereitet, sind Dateinamen mit '-' am Beginn und '\' oder '"' und ähnliches. Laut Definition dürfen alle Zeichen außer '/' und 'NULL' im Dateinamen vorkommen. Wer sich wirklich gegen das meiste absichern will, muss über "NULL-Terminierte Dateinamen" arbeiten. find unterstützt das natürlich.

robi
 
Danke robi,
Ich versuche gerade, eine Testdatei mit Zeilensprung im Dateinamen anzulegen,
es will mir nicht gelingen.
 
A

Anonymous

Gast
versuch mal folgendes einzugeben
Code:
 touch " das
ist
eine
datei
mit
vielen
Zeilen
im
Namen"
und das geht genauso auch mit Inhalt
Code:
echo "das hier ist der Inhalt der Datei" > "das
ist
der 
Datei
Name"
 
Die Umleitung mittels echo hatte ich schon probiert aus einem Skript und direkt.
 
Fazit: 'find -print0' löst das Problem auch nicht komplett, der Einsatz einer
Programmiersprache auch nicht, denn was nützt mir z.B. eine Playlist, die mein
Mp3-Player nicht versteht ?

Dazu ein anderes, konkretes Beispiel aus dem Leben: Ein Freund meint verzweifelt:
"Virus hat mein Win zerschossen, nix geht mehr, wenn ich Win neu installiere, sind alle
Urlaubsfotos weg." Wenn ich ihm nun anbiete, mir die Festplatte zu geben, um seine Fotos
zu retten, habe ich wenig Lust auf stundenlanges Suchen nach den Fotos - wenn ein
Skriptchen doch alles viel bequemer erledigt. Und auf Win-Filesystemen gelten nun mal
andere Dateinamenregeln.

Größtmögliche Sicherheit ist hier wohl nur mittels Textfilter zu erreichen, der nur
erprobte Dateinamen durchlässt und alles andere zur Handbearbeitung ( z.B. umbenennen )
in die 'Fliste' ( siehe Skript ) einträgt. Es wird auf verschiedene Textfilter hinauslaufen,
etwa so:
'geeignet für meinen Mp3-Player', 'geeignet für Windows (ntfs)', u.s.w..
Am wichtigsten ist mir, dass der Skript keinerlei Schaden anrichten kann. Robis
Hinweis hat dazu geführt, dass ich 'test -e' nun nicht mehr als 100%-Verifikation
ansehen kann. Der Besuch in diesem Forum hat sich für mich sehr gelohnt.

Nochmals vielen Dank.

Wer auf einem Dateisystem bleibt und keine Listen braucht, kommt übrigens mit
Konstruktionen weiter wie z.B.:
Code:
find OPTS -exec BEFEHL {} \;
 
Oben