Dateinamen suchen mit bestimmten Charaktern

Gast #5534729
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
Gast #5534731
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
Gast #5534737
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.
#5534742
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 ][^/]*$'
#5534743
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.
Gast #5534752
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 .
#5534763
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.
Gast #5534768
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
Gast #5534774
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!
#5534784
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.
Gast #5534962
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!
Gast #5534992
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren