[gelöst] find mit regex Probleme

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
synapsenstau
Beiträge: 171
Registriert: 08.10.2013 09:56:34
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Südharz

[gelöst] find mit regex Probleme

Beitrag von synapsenstau » 16.06.2015 13:47:47

Ich wollte mal eben schnell ein paar alte Windows "Dateileichen" finden im Musikordner finden. Beim vorhandensein einer Datei (kopieren unter Windows) wird ja eine "(1)", "(2)" etc zu dem Dateinamen hinzugefügt. Ich habe mehrere

Code: Alles auswählen

playlist.m3u
playlist(1).m3u
playlist(2).m3u
, die alle den gleichen Inhalt haben und somit brauche ich wirklich nur die erste.

Habe nun versucht mit

Code: Alles auswählen

find /media/musik/ -type f -regex ".*\x28\d\x29.*"
nach ihnen zu suchen. Doch leider findet 'find' nichts. Wo liegt der Hase im Pfeffer
\x28 = (
\d = dezimalzeichen
\x29 = )
.* = gierig und 'frisst' alles andere
Sollte doch eigentlich so klappen, oder? Natürlich will/muß ich die regexp Suche noch verfeinern (in die Richtung ".*\x28\d\x29\.\w{3}), damit er nur die findet, wo die '(1)' vor dem Punkt kommt. Erstmal wäre ich froh zu verstehen was ich falsch mache. Die find manpage hat mir nicht weitergeholfen.
Zuletzt geändert von synapsenstau am 17.06.2015 13:34:08, insgesamt 1-mal geändert.
..::: Intel® Core™ i5-6600 :::..::: 16 GB Ram :::..
..::: 1 TB Nvme :::..::: 1 TB SSD :::..::: NVIDIA GeForce GTX 1070 :::.

gbotti
Beiträge: 846
Registriert: 16.07.2010 14:24:43
Wohnort: München

Re: find mit regex Probleme

Beitrag von gbotti » 16.06.2015 14:04:44

Hi.

Ich bin leider auch nicht der Regex-Spezialist, jedoch müsste die Variante ".*\x28\d\x29\.\w{3}" laut http://regexpal.com/ funktionieren. Tuts aber nicht, eventuell verwende ich die Regex mit find auch falsch. Was allerdings funktioniert ist das hier:

Code: Alles auswählen

find . -type f -name "*(*).m3u"
Eventuell solltest du dir mal fdupes ansehen, das kann Inhalte vergleichen, auch wenn der Dateiname komplett unterschiedlich ist.
Georg
RTFM, LMGTFY, Orakel... Ach... Warum muss man suchen...
Schrödingers Backup --- "Der Zustand eines Backups ist unbekannt, solange man es nicht wiederherstellt" --- Quelle: Nixcraft

Benutzeravatar
Meillo
Moderator
Beiträge: 8813
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: find mit regex Probleme

Beitrag von Meillo » 16.06.2015 14:11:23

gbotti hat geschrieben:

Code: Alles auswählen

find . -type f -name "*(*).m3u"
Besser ist wohl

Code: Alles auswählen

find . -type f -name "*([0-9]).m3u"
Use ed once in a while!

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: find mit regex Probleme

Beitrag von rendegast » 16.06.2015 14:28:48

, die alle den gleichen Inhalt haben und somit brauche ich wirklich nur die erste.
Debianfdupes
Die Dateien sollten dafür wohl checksummenidentisch sein.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

gbotti
Beiträge: 846
Registriert: 16.07.2010 14:24:43
Wohnort: München

Re: find mit regex Probleme

Beitrag von gbotti » 16.06.2015 14:35:51

rendegast hat geschrieben: Die Dateien sollten dafür wohl checksummenidentisch sein.
Klar ;)
Georg
RTFM, LMGTFY, Orakel... Ach... Warum muss man suchen...
Schrödingers Backup --- "Der Zustand eines Backups ist unbekannt, solange man es nicht wiederherstellt" --- Quelle: Nixcraft

Benutzeravatar
synapsenstau
Beiträge: 171
Registriert: 08.10.2013 09:56:34
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Südharz

Re: find mit regex Probleme

Beitrag von synapsenstau » 16.06.2015 14:38:04

Meillo hat geschrieben: Besser ist wohl

Code: Alles auswählen

find . -type f -name "*([0-9]).m3u"
Danke, das hat mich auch zum Ziel gebracht. Mit ergänzendem '-exec rm....' bin ich sie nun auch alle los.
gbotti hat geschrieben: Eventuell solltest du dir mal fdupes ansehen, das kann Inhalte vergleichen, auch wenn der Dateiname komplett unterschiedlich ist.
Ja danke dir für den netten Hinweis, aber dafür war mir die File-Menge zu groß. Es waren ja nicht nur die *.m3u. Das ging ja mit album(1).jpg und co weiter.

Letztendlich würde mich aber doch interessieren wo mein Fehler lag....
Ich müsste nämlich noch nach verwendeten Lehrzeichen/space in Dateinamen suchen. Dafür fällt mir im Augenblick nämlich keine Lösung mit normalen Wildcards ein.
..::: Intel® Core™ i5-6600 :::..::: 16 GB Ram :::..
..::: 1 TB Nvme :::..::: 1 TB SSD :::..::: NVIDIA GeForce GTX 1070 :::.

Benutzeravatar
Meillo
Moderator
Beiträge: 8813
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: find mit regex Probleme

Beitrag von Meillo » 16.06.2015 15:02:50

synapsenstau hat geschrieben: Ich müsste nämlich noch nach verwendeten Lehrzeichen/space in Dateinamen suchen. Dafür fällt mir im Augenblick nämlich keine Lösung mit normalen Wildcards ein.
Das findet Dateien mit Leerzeichen:

Code: Alles auswählen

find . -type f -name "* *.m3u"
(btw: Dieser Thread is ganz schoen lehrreich! *scnr*)
Use ed once in a while!

gbotti
Beiträge: 846
Registriert: 16.07.2010 14:24:43
Wohnort: München

Re: find mit regex Probleme

Beitrag von gbotti » 16.06.2015 15:20:17

synapsenstau hat geschrieben:Mit ergänzendem '-exec rm....' bin ich sie nun auch alle los.
Ein '-delete' hätte auch gereicht ;)

Ich habe mir den Befehl nochmal angesehen. So wie ich das verstehe gibt es für Regex verschiedene Dialekte???

Mit dem folgenden Befehl hab ichs dann auch mit einer Regex geschafft:

Code: Alles auswählen

root@server01:~# find . -type f -regextype posix-extended -iregex ".*\([0-9]\)\.\w{3}"
./test/playlist(2).w3c
./test/playlist(1).w3c
./test/irgendwas(1).jpg
Vielleicht kann das mal jemand genauer erläutern bitte :)
Georg
RTFM, LMGTFY, Orakel... Ach... Warum muss man suchen...
Schrödingers Backup --- "Der Zustand eines Backups ist unbekannt, solange man es nicht wiederherstellt" --- Quelle: Nixcraft

Benutzeravatar
Meillo
Moderator
Beiträge: 8813
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: find mit regex Probleme

Beitrag von Meillo » 16.06.2015 15:48:52

gbotti hat geschrieben: So wie ich das verstehe gibt es für Regex verschiedene Dialekte???
[...]
Vielleicht kann das mal jemand genauer erläutern bitte :)
Donald Knuth: Digital Typography, ch. 33, p. 649 (1999) hat geschrieben: I define UNIX as 30 definitions of regular expressions living under one roof.
Reicht das? :-D
Use ed once in a while!

r4pt0r
Beiträge: 1237
Registriert: 30.04.2007 13:32:44
Lizenz eigener Beiträge: MIT Lizenz

Re: find mit regex Probleme

Beitrag von r4pt0r » 17.06.2015 00:02:24

Schon für sed und awk gibt/gab es über die Jahrzehnte etliche verschiedene (kommerzielle) Versionen die alle eigene "Dialekte" und Schnittmengen von Regulären Ausdrücken hatten - immerhin sind GNU sed und gawk "relativ" einheitlich. Mit Perl wurde auch noch ordentlich weitergebastelt und dazu kommen dann noch die diversen Shells mit verschiedenen Varianten von globbbing, das "ähnlich funktioniert aber überhaupt nix mit regexp zu tun hat" :wink:
"find" nutzt z.t. ne sehr eigenartige Schnittmenge von globs und regexp - da bin ich auch noch nie ganz durchgestiegen und baue daher sicherheitshalber meistens nen Filter mit sed...

Die vll einzig "sichere" Schnittmenge ist die in POSIX festgelegte (+extended POSIX) - die je nach Tool aber explizit aktiviert werden muss (find)


Stells dir vor wie im Bayrischen Wald: von einem Baum zum nächsten ändert sich der Dialekt :mrgreen:


("Mastering Regular Expressions" von O'Reilly ist nicht ohne Grund ein 500-Seiten Totschläger - und steigt definitiv nicht bei den Grundlagen ein! Als Einstieg kann ich "sed&awk" empfehlen, damit lässt sich schon so einiges anstellen)

gbotti
Beiträge: 846
Registriert: 16.07.2010 14:24:43
Wohnort: München

Re: find mit regex Probleme

Beitrag von gbotti » 17.06.2015 09:08:41

Den Beitrag würde ich jetzt gerne Markieren :D

Der Vergleich mit dem bayerischen Wald ist herrlich... Ich komme aus der Ecke und weiß wovon du redest...
Georg
RTFM, LMGTFY, Orakel... Ach... Warum muss man suchen...
Schrödingers Backup --- "Der Zustand eines Backups ist unbekannt, solange man es nicht wiederherstellt" --- Quelle: Nixcraft

Benutzeravatar
synapsenstau
Beiträge: 171
Registriert: 08.10.2013 09:56:34
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Südharz

Re: find mit regex Probleme

Beitrag von synapsenstau » 17.06.2015 13:32:14

Meillo hat geschrieben: Das findet Dateien mit Leerzeichen:

Code: Alles auswählen

find . -type f -name "* *.m3u"
:facepalm: Na klar. Das einfachste sieht man immer erst zum schluß.
gbotti hat geschrieben: Mit dem folgenden Befehl hab ichs dann auch mit einer Regex geschafft:

Code: Alles auswählen

root@server01:~# find . -type f -regextype posix-extended -iregex ".*\([0-9]\)\.\w{3}"
./test/playlist(2).w3c
./test/playlist(1).w3c
./test/irgendwas(1).jpg
Danke für den hinweis. Werde dem nachgehen....
..::: Intel® Core™ i5-6600 :::..::: 16 GB Ram :::..
..::: 1 TB Nvme :::..::: 1 TB SSD :::..::: NVIDIA GeForce GTX 1070 :::.

Antworten