klausph
Goto Top

Linux: wie finde ich "unmögliche" zeichen in dateinamen?

guten tag
nach stundenlangen studium von "dem kofler" und anderen grundlagenwerken weiss ich nicht weiter.

es geht um folgendes:

eine NAS von qnap. drauf ist ein linux (es gibt keine exakte bezeichnund dafür!), shell-aufgaben erledigt die BusyBox [v1.01 (2015.01.25-18:35+0000) multi-call binary]. IRGENDWANN vor einigen jahren hat es meinerseits wohl versuche gegeben, mit robocopy oder anderen (windows)kopierern dateien raufzukopieren. da muss einiges (aber weniges!) schief gegangen sein.

wenn ich heutzutage mit meinen robocopy-scripts rangehe, um von einer NAS auf die backup-NAS zu kopieren, bekomme ich wenige (aber störende!) fehlermeldungen wie:
\\qnap\allegro\_DATA\STN\_intranet_alt\www\scripts\ruckzuck\php_neu\bilder\ Zlter
2015/02/04 08:59:48 FEHLER 123 (0x0000007B) Folgende Datei wird kopiert \\qnap\allegro\_DATA\STN\_intranet_alt\www\scripts\ruckzuck\php_neu\bilder\
Die Syntax f?r den Dateinamen, Verzeichnisnamen oder die Datentr"gerbezeichnungist falsch.

\\qnap\allegro\_DATA\TZM\
\\qnap\allegro\_DATA\TZM\_boehlke\
....

auf den ersten blick übersieht man das leicht. aber in wirklichkeit gibt es auf der quellen-NAS, wenn man mit dem mc raufschaut, eine datei, die hat einen umlaut, der aber als klötzchen angezeigt wird. es ist m.E. hex81, das kann man sehen, wenn man ls > datei macht, und mit dem mc und F3 und hex-modus sich das anschaut.

ist dieser umlaut IN EINEM subdir enthalten, dann rastet robocopy völlig aus, und verweigert jegliche kopiererei im dazugehörigen stammverzeichnis. da gibt es dann plötzlich "leere" verzeichnisse oder so. das bedeutet auf dem backup-NAS datenverlust.

ich habe nun mit windowsmitteln KEINE change, mich den sudirs zu nähern. windows kann sie nicht einlesen. ich muss also auf der linux-ebene weitermachen.
OK!

Frage: wie findet man in linux dateien und oder unterverzeichnisse, die "unmögliche" zeichen haben?
man kann ja damit anfangen, erstmal alle deutschen umlaute abzufragen. oder nur das deutsche "ü" (hex81).
ich denke, das geht, oder müsste gehen mit: find

mein test hat aber nichts gebracht:
sh-3.2# find . -type f -name \*\h81\*
./RSB/_neu_2012_7/hans2000/prg/h816

ok. abwandlungen wie:
sh-3.2# find . -type f -name \*\x81\*
sh-3.2# find . -type f -name ~\*\x81\*~
sh-3.2# find . -type f -name ~*\x81*~
bringen aber nichts!
da, ab dem punkt ist aber eine datei die "ein klötzchen" im namen drin hat.....

was mir klar ist: mit \ muss ich escapen
aber ~ scheint nichts zu bringen.

und: ich hoffe, daß die BusyBox das "original"-find eingebaut hat. und nicht nur einen geringeren umfang uns gibt....

ein weg, der mir übrigbleibt: alle robocopy-logdateien nach "FEHLER 123" per hand zu durchsuchen, und dann weiter in der Nähe des angegebenen ortes suchen. (3 TB warten auf mich, mit riesigen zeichenbäumen..... ;-(

letzte die ?entscheidende? frage:
wie kann man mit find nach einem hex-wert suchen?
\x81 klappt nicht.


danke fürs mitdenken
euer klaus(i)

Content-ID: 262256

Url: https://administrator.de/forum/linux-wie-finde-ich-unmoegliche-zeichen-in-dateinamen-262256.html

Ausgedruckt am: 23.12.2024 um 15:12 Uhr

114757
Lösung 114757 04.02.2015 aktualisiert um 19:28:24 Uhr
Goto Top
klausph
klausph 04.02.2015 um 14:16:17 Uhr
Goto Top
mönsch jodel32.
ich habe doch natürlich unter administrator.de gesucht, wie ein weltmeister. den beitrag oben nicht gefunden. es kam mir schon komisch vor (nix zu finden). DANKE!

so: wie ich's mir fast dachte: die busybox spielt nicht mit. ich musste aus dem skript 2x "-depth" entfernen.

danach gelang der aufruf. aber ohne ergebnis.
ich werde mal die sonderzeichen aus der mac-welt da einbauen. mal schauen.
aber dann kommen wir doch noch zu der frage: wie baue ich das hex81 ein?
mal sehen, ob ich die antwort selber finde...

zwischengruß k.l.
klausph
klausph 04.02.2015 um 14:46:21 Uhr
Goto Top
etwas angepasst:
2x "-depth" ist weg!
statt dem _, was er anstelle schreiben soll, will ich ja an die dateien rankommen, also soll erschreiben: "__zzyyxx__" statt des einen buchstabens. das kann ich dann prima mit updatedb und locate suchen.

trotzdem DAS problem:
man scheint mit find nicht sowas definieren zu können: -name "*[\x81]*"
hexwerte suche ich damit also nicht.

dann definieren wir doch anderes!
suche alles, was nicht [A-Z, a-z, 0-9] entspricht. mal schauen


erstmal das minimalst veränderte skript:

#!/bin/bash.
find . -name "*[\<\>/\*\?\|\"\:]*" | while read FILEDIR
do
DIR="${FILEDIR%/*}"
FILE="${FILEDIR/*\/}"
NEWFILE="${FILE//[\<\>\/\*\?\|\"\:]/__zzyyxx__}"
mv "$DIR/$FILE" "$DIR/$NEWFILE"
done
find . -name "*?." -type d | while read DIR
do
NEWDIR="${DIR/%./}"
if ! test -d "$NEWDIR" ;then
mv "$DIR" "$NEWDIR"
fi
done

gruß k.l.
klausph
klausph 04.02.2015 um 15:07:50 Uhr
Goto Top
großes lob an geist des forums: administrator.de!
genau DAS ist es: (hoffentlich) mitdenkende fragesteller wissen nicht weiter, bekommen anregungen (keiner verlangt fertige lösungen face-wink
und kommen so zum ziel.

also:
"schaut auf diese stadt", hat kennedy gesagt! (ca 1962...)
also face-wink
schaut auf dieses skript: (mit berücksichtigung der BusyBox! argh!)

#!/bin/bash
find . -name "*[!A-Z!a-z!0-9!-!_!.]*" | while read FILEDIR
do
DIR="${FILEDIR%/*}"
FILE="${FILEDIR/*\/}"
NEWFILE="${FILE//[!A-Z!a-z!0-9!-!_!.]/__zzyyxx__}"
mv "$DIR/$FILE" "$DIR/$NEWFILE"
done
find . -name "*?." -type d | while read DIR
do
NEWDIR="${DIR/%./}"
if ! test -d "$NEWDIR" ;then
mv "$DIR" "$NEWDIR"
fi
done

so habe ich mir das gedacht:
er benennt alle dateien um, die keine normalen buchstaben haben (also A-Z und a-z), die auch keine ziffern haben (0-9, und in den dateinamen darf ein _, sowie ein - und natürlich der punkt vorkommen.
mit anderen worten: alles dem o.g. muster NICHT entspricht, bekommt "__zzyyxx__" im dateinamen. das kann man dann im 2. schritt suchen und kontrollieren und dann löschen.
bin sicher, das skript ist noch nicht perfekt. es wird noch zeichen geben, die ich "erlauben" muss.... mal schauen.

gruß k.l.
klausph
klausph 04.02.2015 aktualisiert um 19:28:52 Uhr
Goto Top
am 4.2.2015 nochmal ergänzt. und fertig!

letztenendes benötige ich NUR diese beiden zeilen:

#!/bin/bash
find . -name "*[!A-Z!a-z!0-9!\-!_!.!@!#!=! !\(!\)!~!\$!&!ö!ä!ü!+!,!.!;!\[!\]!Ä!Ü!Ö!'!%!ß!§!{!}!'!\´!\`!é!è!^!:]*"

erklärung:
jedes der zeichen, die für meine fehlersuche NICHT interessant ist, also NICHT angezeigt werden soll, ist mit einem "!" gekennzeichnet.
einige wenige zeichen MÜSSEN nach dem "!" mit einem "\" versehen werden.
z.b. das zeichen ] . MUSS oben so eingetragen werden: !\]

ich lasse dieses miniskript ab einem bestimmten verzeichnis laufen, und sehe sofort, was ist schräg ist, was ist OK.

neugierige fragen:
man kann evtl. noch obiges verbessern!?

sowie man schreibt !A-Z (was ja heisst: alles was nicht großes A bis oder großes Z ist, berücksichtige bitte...)

könnte man nicht schreiben?:
! -/ soll heissen: vom leerzeichen hex20 bis zum /
hex2f. evtl muss hex2f mit \ "escaped" werden face-wink

mir wäre viel wohler, wenn ich diese konstruktion mit A-Z so schreiben könnte: 065-090 oder x41-x5a ...
leider keine ahnung... in den docus zu find gibt keine hinweise...

gruß klaus