Hallo Ich möchte Dateien suchen die außer Buchstaben, Leerzeichen und/oder Zahlen auch andere Zeichen beinhalten. Wie stell ich sowas an unter Windows? Evtl auch unter Linux?
Den Dateinamen in Anführungszeichen setzen. C:\>dir "* *" /s sucht alle Dateinamen auf der Platte, die ein Leerzeichen enthalten
Das listet auch Verzeichnisnamen auf. Möchte man nur Dateinamen sehen, sollte noch ein /A-D angehängt werden.
1 | dir "* *" /s /a-d |
Kleiner Paul schrieb: > auch andere Zeichen beinhalten Linux - auflisten von Dateinamen, welche die Zeichen #, @, oder ö enthalten: find /pfad/welcher/durchsucht/werden/soll/ | grep -e"#" -e"@" -e"ö" HTH
2 Cent schrieb: > Kleiner Paul schrieb: >> auch andere Zeichen beinhalten > > Linux - auflisten von Dateinamen, und Verzeichnisnamen > welche die Zeichen #, @, oder ö > enthalten: > > find /pfad/welcher/durchsucht/werden/soll/ | grep -e"#" -e"@" -e"ö" $ find /pfad ~/noapfad -type f | grep -P '(#|@|ö)' #nur Files $ find /pfad ~/noapfad -type d | grep -P '(#|@|ö)' #nur Directories
2 Cent schrieb: > Kleiner Paul schrieb: >> auch andere Zeichen beinhalten > > Linux - auflisten von Dateinamen, welche die Zeichen #, @, oder ö > enthalten: > > find /pfad/welcher/durchsucht/werden/soll/ | grep -e"#" -e"@" -e"ö" > > HTH ich möchte aber alle sonderzeichen finden. also alles außer buchstaben und zahlen
Dann wirst Du Dir die Syntax von grep ansehen müssen, wie man dort eine regex angibt, die alle zeichen außer [0..9][a..z][A..Z] und ' ' auswirft.
:
Bearbeitet durch User
> C:\>dir "* *" /s > sucht alle Dateinamen auf der Platte, die ein Leerzeichen enthalten dir mit mehr als einem '*' hat mich des öfteren angelogen und vorhandene Dateien nicht angezeigt, unter div. Varianten von WinYX :-( BTDT.
Kommandozeile vor dem Frühstück für Alle! schrieb: > dir mit mehr als einem '*' hat mich des öfteren angelogen Aha. Magst Du konkrete Beispiele nennen, und auch die Windows-Versionen? Zwischen Windows 95 und seinen Aufgüssen und den ernstgemeinten Windows-Versionen besteht hier ein essentieller Unterschied.
Wenn man auch Dateien mit Newlines im Pfad berücksichtigen will, würde ich das unter Linux so machen:
1 | find . -print0 | while IFS= read -r -d '' file |
2 | do |
3 | if basename "$file" | grep -q '[^a-zA-Z0-9 ]' |
4 | then |
5 | printf "%s\n" "$file" |
6 | fi |
7 | done |
Das '[^a-zA-Z0-9 ]' ist ein Regex. Das ^ gibt an, das jedes Zeichen, das nicht in der Liste ist, gematcht werden soll. Das ganze while read und printf zeug ist nur zur Behandlung der Newlines, wenn man die nicht hat kann man das natürlich auch weglassen:
1 | find . | grep -P '[^/]*[^/a-zA-Z0-9 ][^/]*$' |
Hallo Kleiner, Kleiner Paul schrieb: > ich möchte aber alle sonderzeichen finden. also alles außer buchstaben > und zahlen Du durchläufst den Verzeichnisbaum in der Programmiersprache Deiner Wahl und prüfst pro Dateinamen für jeden Buchstaben den ASCII-Code, ob er in den Nummernblöcken der Zahlen, Klein- oder Großbuchstaben liegt. Wenn im Dateisystem alles mit Unicode abgebildet wird, ist das auch kein Problem, weil im Bereich bis 127 die ASCII-Codes den Unicode-Codepoints entsprechen. Eine fertige Software dafür kenne ich nicht.
>> find /pfad/welcher/durchsucht/werden/soll/ | grep -e"#" -e"@" -e"ö" > > ich möchte aber alle sonderzeichen finden. also alles außer buchstaben > und zahlen Lerne u.A. auch mit den POSIX CHARACTER CLASSES umzugehen, es lohnt sich! Das sind z.B. ":punct:" * http://www.pcre.org/pcre.txt
Peter M. schrieb: > Hallo Kleiner, > > Kleiner Paul schrieb: > >> ich möchte aber alle sonderzeichen finden. also alles außer buchstaben >> und zahlen > > Du durchläufst den Verzeichnisbaum in der Programmiersprache Deiner Wahl > und prüfst pro Dateinamen für jeden Buchstaben den ASCII-Code, ob er in > den Nummernblöcken der Zahlen, Klein- oder Großbuchstaben liegt. In Python3 sind ALLE Strings per default Unicode. import os, re # Nicht vergessen! :-) > Wenn im Dateisystem alles mit Unicode abgebildet wird, ist das auch kein > Problem, weil im Bereich bis 127 die ASCII-Codes den Unicode-Codepoints > entsprechen. > > Eine fertige Software dafür kenne ich nicht. find um Verzeichnishierarchien zu durchpflügen und grep um nach Muster zu suchen ...beides seit Jahrzehnten fertig .
Kommandozeile vor dem Frühstück für Alle! schrieb: > Peter M. schrieb: >> Eine fertige Software dafür kenne ich nicht. > find um Verzeichnishierarchien zu durchpflügen > und > grep um nach Muster zu suchen > > ...beides seit Jahrzehnten fertig . Interessant! Wusste nicht, dass Grep nach mehreren Mustern suchen kann. Dann müsste kleiner Paul sich nur einmal die Suchdatei mit allen Sonderzeichen konfigurieren.
Vielleicht auch noch auf mehreren Laufwerken (was auch immer diese sein sollen...) gleichzeitig? Z.B. C: D: E: F: G: H: W: Z:
1 | $ find /cygdrive/[czwd-h]/ -type f | grep -P '[[:punct:]]' |
Oder weil sequentiell so langsam ist, parallel: (ok, die Ergebnisse prasseln durcheinander auf den User zu; dies zu ordnen ist Hausaufgabe zum Stoff vom Aufbaukurs ;-)
1 | $ for do in /cygdrive/[czwd-h]/ |
2 | > do |
3 | > ( find "$dp" -type f | grep -P '[[:punct:]]' ) & |
4 | > done |
>>> Eine fertige Software dafür kenne ich nicht. >> find um Verzeichnishierarchien zu durchpflügen >> und >> grep um nach Muster zu suchen >> >> ...beides seit Jahrzehnten fertig . > > Interessant! Wusste nicht, dass Grep nach mehreren Mustern suchen kann. Tja, wenn man sich nicht mit EDV aus der Zeit von VOR den PeeZeehs auseinandersetzen will so verpasst man halt mehr als die Hälfte an Nützlichkeiten... * https://en.wikipedia.org/wiki/Grep -->Jahrgang!
Hallo Kommandozeile und kleiner Paul, Kommandozeile vor dem Frühstück für Alle! schrieb: > Vielleicht auch noch auf mehreren Laufwerken (was auch immer diese > sein sollen...) gleichzeitig? > Z.B. C: D: E: F: G: H: W: Z:$ find /cygdrive/[czwd-h]/ -type f | grep -P > ':punct:' > > Oder weil sequentiell so langsam ist, parallel: (ok, die Ergebnisse > prasseln durcheinander auf den User zu; dies zu ordnen ist Hausaufgabe > zum Stoff vom Aufbaukurs ;-)$ for do in /cygdrive/[czwd-h]/ >> do >> ( find "$dp" -type f | grep -P ':punct:' ) & >> done das sieht ja elegant kurz aus, aber "grep -P" ist hier https://www.gnu.org/software/grep/manual/grep.html#Matching-Control als "highly experimental" gekennzeichnet. @kleiner Paul: Das Beispiel von "Kommandozeile" bezieht sich auf Windows-Maschinen. Der Ordner "cygdrive" ist dann vorhanden, wenn man sich die Software "cygwin" installiert. Damit hat man so eine Art abgespeckte Unix-Shell. Insbesondere hat man einen Unix-Verzeichnisbaum. Die Windowslaufwerke verstecken sich in dem Baum im Ordner "cygdrive". find /cygdrive/c/ -type f | grep -P ':punct:' Folgende Zeichen werden mit dem punct-Ausdruck gefunden: `[:punct:]' Punctuation characters: ! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~. Quelle: http://www.delorie.com/gnu/docs/grep/grep_8.html Ich hab's aber selber noch nicht ausprobiert.
:
Bearbeitet durch User
Der find, der unter Linux normalerweise installiert ist (GNU find), kann direkt nach Regulären Ausdrücken filtern:
1 | find «directories» -type f -regex ".*[^a-zA-Z0-9 /.].*" |
Oder, falls die Namen der Verzeichnisse egal ist:
1 | find «directories» -type f ! -regex ".*/[a-zA-Z0-9 .]*" |
Danke für die Anregung und die vielen guten Ideen hier :D Nach vielen Stunden hacken (das Problem lässt mich nicht los) mein bis jetzt bester Einzeiler: find /pfad/welcher/durchsucht/werden/soll/ ! -regex ".*/[a-zA-Z0-9 ._-\(\)\ #&]*" Da kommts halt auch sehr darauf an, was als "Sonderzeichen" gemeint ist. Auf jeden Fall interessant was so alles "vom russischen Bahnhof" auf meiner Platte rumliegt :D Cheerio!
Damit man das Dateisystem nicht so belasten muss (wie bei find), kann man einfach locate benutzen. Kann auch mit REGEX umgehen. Das speichert alle Dateinamen in einer eigenen Datenbank und ist auf vielen Linux-Systemen schon installiert.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.