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

Überreste von Dateien mit alter Codepage

viper79

Newbie
Hallo!

Ich habe folgendes Problem:
Seit einiger Zeit arbeite ich bei einer Firma und betreue dort die EDV. Auf dem File-Server läuft Suse 8.2. Vor ungefähr zwo Jahren wurde wohl ein Update des Samba-Servers durchgeführt. Dabei wurde auch der character-set von ? auf iso8859-15 geändert. Auf jeden Fall konnte ab dem Zeitpunkt nicht mehr von Windows aus auf Dateien zugegriffen werden, die Umlaute wie ÖÄÜ usw. enthalten. In der Shell werden dies mit einem ? antatt des Umlautes angezeigt. Es hat sich dann wohl jemand die Mühe gemacht die wichtigsten Dateien per Hand umzubenennen :twisted: . Jetzt habe ich das Problem von alten Dateileichen die nun noch auf dem Server sind.

Beispiel:

drwxrws--- 11 root ab2ha 496 Oct 26 18:40 ./
drwxrws--- 5 root ab2ha 144 Mar 28 2003 ../
-rwxrw---- 1 admin ab2ha 39129 May 22 2002 Fragenkatalog AB2-Gesamt-WS 2002.pdf*
-rwxrw---- 1 claudia ab2ha 30262 Mar 10 2004 Fragenkatalog AB2-Gesamt-WS0304.pdf*
-rwxrw---- 1 admin ab2ha 455680 Sep 18 2001 Fragenkatalog AB2-Gesamt.doc*
-rwxrw---- 1 admin ab2ha 34296 Jan 15 2002 Fragenkatalog AB2-Gesamt.pdf*
drwxrws--- 2 root ab2ha 96 Feb 11 2003 Fr?hjahr 2003/
drwxrws--- 2 admin ab2ha 264 Nov 13 2003 Frühjahr 2003/

Hier wird das Verzeichniss "Frühjahr 2003" doppelt angezeigt.

Meine Frage: Gibt es eine Möglichkeit die alten Dateien (die mit dem ?) zu erkennen und zu löschen ohne dass die neuen Dateien mit demselben Namen auch gelöscht werden?

Das ganze Problem ist vielleicht zu kompliziert beschrieben aber ich hoffe das eigentliche problem ist klar geworden.
 

regexer

Advanced Hacker
Ersteinmal würde ich mit "ls -b" nachsehen, was für Zeichen in den nicht darstellbaren Namen wirklich enthalten sind. Diese Zeichen werden dann in der Form "\376" dargestellt.

Danach kann man dann mit find weiter machen. Etwa wie folgt:
Code:
find /verzeichnis -name \*$'\376'\*
Die Trefferliste würde ich kontrollieren und erst dann einen "-exec" anhängen. Am Ende würde der Befehl dann so aussehen:
Code:
find /verzeichnis -name \*$'\376'\* -exec rm {} \;
Die 376 musst du natürlich durch eines deiner Problem-Zeichen ersetzten. Für ein anderes Zeichen das ganze dann wiederholen...
 
OP
V

viper79

Newbie
Danke für den super tip!

Kannst Du mir vielleicht die genau Funktionsweise von den Parametern des find Befehls erklären?
 

regexer

Advanced Hacker
Kannst Du mir vielleicht die genau Funktionsweise von den Parametern des find Befehls erklären?
In diesem Fall wurden eigentlich nur zwei Parameter verwendet:

-name
Auf diesen parameter folgt das Suchmuster. Wichtig ist, hierbei * und ? mit einem Backslash zu entwerten. Sonst kann es sein, dass nicht alle Dateien gefunden werden.
-exec
Auf -exec folgt der Befehl, der für jede gefundene Datei ausgeführt werden soll. Hier wird die aktuelle Datei durch die Zeichen "{}" symbolisiert. Der Befehl wird mit einem "\;" abgeschlossen.

Ansonsten ist $'\376' eine Maskierung für das Zeichen octal 376 im Ascii-Code. Das ist eine Feature der Shell (bash), und lässt sich auch bei ls und anderen Befehlen anwenden.
$'\101' wäre zum Beispiel ein "A". Man kann aber auch die Hexadezimale Notierung verwenden. Zum Beispiel $'\x41' für ein großes "A".

Der find-Befehl kann noch viel mehr (Dateien älter als x Tage finden usw.). Siehe hierzu
Code:
man find
 
Oben