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?
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, 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
> C:\>dir "* *" /s> sucht alle Dateinamen auf der Platte, die ein Leerzeichen enthaltendir 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:
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 ;-)
>>> 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.
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.