Forum: PC Hard- und Software Dateinamen suchen mit bestimmten Charaktern


von Kleiner Paul (Gast)


Lesenswert?

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?

von g457 (Gast)


Lesenswert?

> Evtl auch unter Linux?

man find

HTH

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

Den Dateinamen in Anführungszeichen setzen.

C:\>dir "* *" /s
sucht alle Dateinamen auf der Platte, die ein Leerzeichen enthalten

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das listet auch Verzeichnisnamen auf. Möchte man nur Dateinamen sehen, 
sollte noch ein /A-D angehängt werden.
1
dir "* *" /s /a-d

von 2 Cent (Gast)


Lesenswert?

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

von Kommandozeile vor dem Frühstück für Alle! (Gast)


Lesenswert?

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

von Kleiner Paul (Gast)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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
von Kommandozeile vor dem Frühstück für Alle! (Gast)


Lesenswert?

> 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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Daniel A. (daniel-a)


Lesenswert?

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 ][^/]*$'

von Peter M. (r2d3)


Lesenswert?

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.

von Kommandozeile vor dem Frühstück für Alle! (Gast)


Lesenswert?

>> 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

von Kommandozeile vor dem Frühstück für Alle! (Gast)


Lesenswert?

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 .

von Peter M. (r2d3)


Lesenswert?

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.

von Kommandozeile vor dem Frühstück für Alle! (Gast)


Lesenswert?

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

von Kommandozeile vor dem Frühstück für Alle! (Gast)


Lesenswert?

>>> 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!

von Peter M. (r2d3)


Lesenswert?

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
von foobar (Gast)


Lesenswert?

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 /.].*"

von foobar (Gast)


Lesenswert?

Oder, falls die Namen der Verzeichnisse egal ist:
1
find «directories» -type f ! -regex ".*/[a-zA-Z0-9 .]*"

von 2 Cent (Gast)


Lesenswert?

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!

von T.roll (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.