Frage zu find

Du hast Probleme mit Deinem eMail-Programm, Webbrowser oder Textprogramm? Dein Lieblingsprogramm streikt?
Antworten
Benutzeravatar
BeS
Moderator
Beiträge: 3236
Registriert: 17.04.2002 18:30:21
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Stuttgart
Kontaktdaten:

Frage zu find

Beitrag von BeS » 20.12.2002 18:27:40

Hallo,
ich möchte mit find alle Dateien suchen, bis auf welche mit bestimmten Endungen. Bisher habe ich das so probiert:

Code: Alles auswählen

for i in `find . \! -name '*[.adb|.ads|.txt]' -type f` ; do rm $i ; done
Es sollen also alle Dateien gelöscht werden, bis auf Dateien mit den Endung .adb .ads und .txt. Mit diesem Befehl werden auch fast alle Dateien wie gewollt gelöscht, nur Dateien ganz ohne Endung werden nicht gelöscht.

Was stimmt an dem Befehl nicht?
Oder wie kann ich es besser machen?

Danke!
Deine Unterstützung für Freie Software kostet dich nur wenige Minuten: www.fsfe.org/support

Ich spreche von Freier Software!

Benutzeravatar
Dookie
Beiträge: 1104
Registriert: 17.02.2002 20:38:19
Wohnort: Salzburg
Kontaktdaten:

Beitrag von Dookie » 20.12.2002 19:12:24

Hi BeS,

hab mir den find befehl mal angeschaut und ausprobiert, sollte eigentlich passen, bei mir findet er auch Dateien ohne Endung. Wie schauts denn mit den premissions der übriggebliebenen Dateien aus?
Und ergänze den rm Befehl mit -v, dann gibt der auch meldungen aus was er macht und woran es eventuell hapert.


Gruß

Dookie

Benutzeravatar
BeS
Moderator
Beiträge: 3236
Registriert: 17.04.2002 18:30:21
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Stuttgart
Kontaktdaten:

Beitrag von BeS » 20.12.2002 19:44:38

Hallo,
die Dateien welche er nicht findet ist eine binär Datei mit den Rechten 755.
rm mit -v bringt auch nichts die Dateien werde ja schon gar nicht gefunden und an rm übergeben.
Ich habe mittlerweile auch ein paar Sachen ausprobiert und Folgendes herausgefunden. Es ist nur eine Datei die mit diesem find Befehl nicht gefunden wird, sie heißt 'beweis' wenn ich sie z.b. in 'beweis1' oder 'test1' umbenenne wird sie gefunden und gelöscht. :roll:

Die Datein 'test', 'wald', 'a.out' und 'politiker2.dat' werden dagegen wieder nicht gefunden und dadurch auch nicht gelöscht.
Wenn ich sie umbenenne werden sie aber wieder gelöscht.

Das ganze kommt mir irgendwie komisch vor...

Was ist an den Dateinamen so besonders, dass sie nicht in die Suchkriterien passen?

Danke!
Deine Unterstützung für Freie Software kostet dich nur wenige Minuten: www.fsfe.org/support

Ich spreche von Freier Software!

ivo
Beiträge: 629
Registriert: 29.04.2002 12:41:22
Wohnort: Lichtenstein/Sa.
Kontaktdaten:

Beitrag von ivo » 20.12.2002 20:15:31

Das blanke find findet die Dateien nicht? Komisch. Ist dein FS in Ordnung?

Ansonsten: Warum nimmst du die find-Option -exec nicht, um die Dateien zu löschen?

tschau
*iv

Benutzeravatar
BeS
Moderator
Beiträge: 3236
Registriert: 17.04.2002 18:30:21
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Stuttgart
Kontaktdaten:

Beitrag von BeS » 20.12.2002 20:34:19

Hallo ivo,
ich habe es auch schon mit

Code: Alles auswählen

find . -type f -name '*[^.adb|^.ads|^.txt|^.dat]' -exec rm {} \;
probiert, das liefert aber das gleiche Ergebnis.

Das komische ist ja auch, dass wenn ich die Dateien umbenenne sie gefunden werden und wenn ich sie dann wieder zurückbenenne sie wieder nicht gefunden werden :roll:

Das es am fs liegt schliesse ich aus, da ich den Befehl an zwei unabhängigen Systemen getestet habe (zu Hause: Debian woody und an der uni mit RedHat7.3)

Hat noch jemand eine Idee?

Danke!

PS. Vielleicht kann es ja mal jemand bei sich mit den oben genannten Dateinamen probieren, ob ihr die gleichen Probleme habt...
Deine Unterstützung für Freie Software kostet dich nur wenige Minuten: www.fsfe.org/support

Ich spreche von Freier Software!

ivo
Beiträge: 629
Registriert: 29.04.2002 12:41:22
Wohnort: Lichtenstein/Sa.
Kontaktdaten:

Beitrag von ivo » 20.12.2002 20:58:42

Code: Alles auswählen

find . -type f \! -name "*.adb" -o \! -name "*.ads" -o \! -name "*.txt" -o \! -name "*.txt" -exec rm {} \;
vielleicht?

Nicht sehr schön, oder? Aber für die Namen hat man nun mal keine REGEXPs.

tschau
*iv

ivo
Beiträge: 629
Registriert: 29.04.2002 12:41:22
Wohnort: Lichtenstein/Sa.
Kontaktdaten:

Beitrag von ivo » 20.12.2002 21:05:00

Jetzt habe ich auch einen Verdacht, was bei deinem Muster nicht stimmt:

Code: Alles auswählen

[abc|hij|xyz]
gibt es nicht. Die Buchstaben in Klammern sind schon oder verknüpft.

Code: Alles auswählen

[abc]*
findet also alle Dateien, die mit a oder b oder c anfangen. Nich Dateien, die mit abc anfangen.

tschau
*iv

Benutzeravatar
BeS
Moderator
Beiträge: 3236
Registriert: 17.04.2002 18:30:21
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Stuttgart
Kontaktdaten:

Beitrag von BeS » 20.12.2002 21:08:34

ivo hat geschrieben:

Code: Alles auswählen

find . -type f \! -name "*.adb" -o \! -name "*.ads" -o \! -name "*.txt" -o \! -name "*.txt" -exec rm {} \;
vielleicht?
Das funktioniert bei mir gar nicht? So wird überhaupt keine Datei mehr gelöscht...

Ich glaube es liegt an der Option -o, damit kann man imho nur zwei Ausdrücke miteinander verbinden.
Deine Unterstützung für Freie Software kostet dich nur wenige Minuten: www.fsfe.org/support

Ich spreche von Freier Software!

Benutzeravatar
Dookie
Beiträge: 1104
Registriert: 17.02.2002 20:38:19
Wohnort: Salzburg
Kontaktdaten:

Beitrag von Dookie » 21.12.2002 00:18:15

Hallo nochmal,

wie schauts aus mit

Code: Alles auswählen

for i in `find . \! -name '*[(.adb)(.ads)(.txt)]' -type f` ; do rm $i ; done

Gruß

Dookie

Benutzeravatar
BeS
Moderator
Beiträge: 3236
Registriert: 17.04.2002 18:30:21
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Stuttgart
Kontaktdaten:

Beitrag von BeS » 21.12.2002 11:04:54

Hallo,
Dookie hat geschrieben:Hallo nochmal,

wie schauts aus mit

Code: Alles auswählen

for i in `find . \! -name '*[(.adb)(.ads)(.txt)]' -type f` ; do rm $i ; done
Funktioniert leider auch nicht :(
Es werden die gleichen Datein wie bisher ausgelassen.

Danke!
Deine Unterstützung für Freie Software kostet dich nur wenige Minuten: www.fsfe.org/support

Ich spreche von Freier Software!

Benutzeravatar
michas
Beiträge: 380
Registriert: 12.08.2002 20:35:09
Wohnort: München

Beitrag von michas » 25.12.2002 00:23:39

das einfachste wird sein, mal genau in der man-page nachzulesen.
da ich dazu gewöhnlich meist auch zu faul war, hab ich immer grep benutzt.
damit klappts eigentlich immer. (weil wesentlich vertrauter.)
Datei die mit diesem find Befehl nicht gefunden wird, sie heißt 'beweis' wenn ich sie z.b. in 'beweis1' oder 'test1' umbenenne wird sie gefunden und gelöscht. icon_rolleyes.gif

Die Datein 'test', 'wald', 'a.out' und 'politiker2.dat' werden dagegen wieder nicht gefunden und dadurch auch nicht gelöscht.
schau auf den letzten buchstaben. t,d uns s befinden sich in den eckigen klammern - 1 nicht.
*[a|sd] sollte wie schon gesagt alle dateien finden die auf a,|,s oder d enden.
auserdem könnte der punkt bei regulären ausdrücken (als joker) probleme machen.

hth
- michas

ulf
Beiträge: 39
Registriert: 22.09.2002 13:00:52

Beitrag von ulf » 25.12.2002 18:01:27

[quote="BeS"][quote="ivo"][code]
find . -type f \! -name "*.adb" -o \! -name "*.ads" -o \! -name "*.txt" -o \! -name "*.txt" -exec rm {} \;
[/code]

vielleicht?
[/quote]

Das funktioniert bei mir gar nicht? So wird überhaupt keine Datei mehr gelöscht...

Ich glaube es liegt an der Option -o, damit kann man imho nur zwei Ausdrücke miteinander verbinden.[/quote]

Bei
find -name x -o -name y -exec ...
steht ein implizites "and" zwischen den letzten beiden Ausdrücken.
Vielleicht
find \( -name x -o -name y \) -exec ...

Antworten