[gelöst] Rekursives Löschen

Warum Debian und/oder eine seiner Spielarten? Was muss ich vorher wissen? Wo geht es nach der Installation weiter?
Antworten
jhr-online
Beiträge: 2186
Registriert: 18.09.2005 15:52:02
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

[gelöst] Rekursives Löschen

Beitrag von jhr-online » 26.12.2005 12:11:07

Mahlzeit,

ich scheine irgendwie gerade bild zu sein, oder so... Ich habe eine sehr großes Verzeichnis mit vielen Unterordnern. Sagen wir der Einfachheit halber, es wären überall wav-Dateien drin und in jedem Verzeichnis auch ein paar jpgs. Wie bitte werde ich diese jpgs los, ohne dass ich in jedes Verzeichnis selber gucken muss? Ich find die Möglichkeit zum rekursiven Löschen nicht...
Kann mir vielleicht jemand eben helfen?

jhr
Zuletzt geändert von jhr-online am 26.12.2005 13:55:19, insgesamt 1-mal geändert.
Desktop: Intel Core2Quad Q8300 2.5GHz, 256GB SSD + 1 TB HDD, 8 GB RAM, Debian Sid, Kernel 3.13

Benutzeravatar
Savar
Beiträge: 7174
Registriert: 30.07.2004 09:28:58
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin

Beitrag von Savar » 26.12.2005 12:18:22

auf eigene Gefahr:

Code: Alles auswählen

find /pfad/zum/oberverzeichnis -type f -name "*.jpg" -exec rm {} \;
MODVOICE/MYVOICE
Debianforum Verhaltensregeln
Log Dateien? -> NoPaste

jhr-online
Beiträge: 2186
Registriert: 18.09.2005 15:52:02
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

Beitrag von jhr-online » 26.12.2005 12:20:56

Savar hat geschrieben:auf eigene Gefahr:
Wieso machst du mir so Angst? :-) Besteht irgendein Risiko?

jhr
Desktop: Intel Core2Quad Q8300 2.5GHz, 256GB SSD + 1 TB HDD, 8 GB RAM, Debian Sid, Kernel 3.13

Benutzeravatar
meandtheshell
Beiträge: 4054
Registriert: 14.01.2005 17:51:30

Beitrag von meandtheshell » 26.12.2005 12:52:49

so steht der Aufruf nach dem ersten match
Savar hat geschrieben:auf eigene Gefahr:

Code: Alles auswählen

find /pfad/zum/oberverzeichnis -type f -name "*.jpg" -exec rm {} \;
so nicht

Code: Alles auswählen

find /pfad/zum/oberverzeichnis -type f -name "*.jpg" -exec rm '{}' \;
markus

jhr-online
Beiträge: 2186
Registriert: 18.09.2005 15:52:02
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

Beitrag von jhr-online » 26.12.2005 13:13:29

Kann ich nicht bestätigen, Markus. Ich hab das, so wie savar geschrieben hat, ausgeführt und kann jetzt keine jpgs mehr finden...

jhr

//edit: Wo wir gerade dabei sind: Kann man eigentlich auch "falschherum" suchen? Wenn ich also einen Musikordner mit mp3s und wmas (entschuldigt, Windows-überbleisel) hab, dass er mir alle Dateien anzeigt, die nicht diesen Typs sind, sodass ich dadurch Unregelmäßigkeiten finden kann?
Desktop: Intel Core2Quad Q8300 2.5GHz, 256GB SSD + 1 TB HDD, 8 GB RAM, Debian Sid, Kernel 3.13

Benutzeravatar
I.C.Wiener
Beiträge: 674
Registriert: 19.08.2003 18:45:35

Beitrag von I.C.Wiener » 26.12.2005 13:17:05

Solange sie keine Leerzeichen im Namen haben, geht das auch in Ordnung.
Who is... LAIN?

Benutzeravatar
meandtheshell
Beiträge: 4054
Registriert: 14.01.2005 17:51:30

Beitrag von meandtheshell » 26.12.2005 13:23:27

jhr-online hat geschrieben:Kann ich nicht bestätigen, Markus. Ich hab das, so wie savar geschrieben hat, ausgeführt und kann jetzt keine jpgs mehr finden...
ja - worst case hast du aber braces in dem/den filenamen und die shell interpretiert diese - wenn das nicht der fall ist wird es durchlaufen
siehe

Code: Alles auswählen

man find
markus

Benutzeravatar
I.C.Wiener
Beiträge: 674
Registriert: 19.08.2003 18:45:35

Beitrag von I.C.Wiener » 26.12.2005 13:37:21

Aus Interesse habe ich gerade mal etwas gelesen und folgendes gefunden.

Code: Alles auswählen

find /shared -name *.doc -and ! -perm -006 -exec chmod 666 { } \;
Bei mir wird jedoch das ! von der Bash immer interpretiert und irgendwas eingefügt und dann schlägt der Befehl fehl.
-not scheint so auch nicht zu funktionieren.
Interessant ist die Möglichkeit aber schon. Funktioniert das bei jemandem?

MfG
Who is... LAIN?

Benutzeravatar
Savar
Beiträge: 7174
Registriert: 30.07.2004 09:28:58
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin

Beitrag von Savar » 26.12.2005 13:40:41

zwischen den geschweiften Klammern darf KEIN Zeichen sein..

"{ }" - falsch
"{}" - richtig..

was meandtheshell meint gilt nur für die

Code: Alles auswählen

-exec command {} +

Option und nicht für (stört aber nicht)

-exec command {} ;
/edit: was heißt schon "darf" ich denke es ist besser wenn da keines steht.. in der manpage ist da kein Zeichen zwischen..

das "!" kannst du vielleicht per \ Escapen.. also
MODVOICE/MYVOICE
Debianforum Verhaltensregeln
Log Dateien? -> NoPaste

Benutzeravatar
I.C.Wiener
Beiträge: 674
Registriert: 19.08.2003 18:45:35

Beitrag von I.C.Wiener » 26.12.2005 13:48:12

Hatte es nur von http://amitsharma.linuxworld.com/how_to_find.htm kopiert (ganz unten.
In meinem Beispiel funktioniert nichtmal

Code: Alles auswählen

-name *.doc
Ich schreibe immer

Code: Alles auswählen

-name "*.doc"
Whatever, ich hatte gar keine {} in meinem nicht funktionierenden Beispiel.

Code: Alles auswählen

find ./ -type f ! -name "*.mp3"
funktioniert jetzt bei mir. hatte einen Denkfehler...

MfG
Who is... LAIN?

jhr-online
Beiträge: 2186
Registriert: 18.09.2005 15:52:02
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

Beitrag von jhr-online » 26.12.2005 13:48:21

Savar hat geschrieben:das "!" kannst du vielleicht per \ Escapen.. also
Ich probiere auch gerade rum... Das klappt so auch nicht... hmm


//edit: Das nenn ich Überschneidung... so klappt's :-) also so wie I.C.Wiener geschrieben hat. Jetzt bleibt noch: Wie suche ich Dateien, die weder *mp3 noch *.wma sind?
Desktop: Intel Core2Quad Q8300 2.5GHz, 256GB SSD + 1 TB HDD, 8 GB RAM, Debian Sid, Kernel 3.13

jhr-online
Beiträge: 2186
Registriert: 18.09.2005 15:52:02
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

Beitrag von jhr-online » 26.12.2005 13:54:48

Hat sich erledigt... Erst denken, dann schreiben - ich weiß!

Code: Alles auswählen

find ./ ! -name "expr1" ! -name "expr2"
Danke für die Hilfe!

jhr
Desktop: Intel Core2Quad Q8300 2.5GHz, 256GB SSD + 1 TB HDD, 8 GB RAM, Debian Sid, Kernel 3.13

Benutzeravatar
meandtheshell
Beiträge: 4054
Registriert: 14.01.2005 17:51:30

Beitrag von meandtheshell » 26.12.2005 14:16:10

@savar
Du bist ein lustiger Fink :D

Nun da wir lustig gechattet haben und du mich nun auch irritiert hast ...

1)
den fall

Code: Alles auswählen

{whitespace between braces}
braces mit Leerzeichen dazwischen gibt es gar nicht

@ihr-online
2)

Code: Alles auswählen

-name "*.doc"
  • du hast hier als command "find"
  • als Argument jedes dem command folgende token auf der command line wobei
  • ein durch ein vorangestelltes "-" das Argument zu einer Option wird
  • alle anderen Argumente zu Parametern
Fazit:
Die Option -name und deren Parameter *.doc bleiben über.
Um zu erreichen das nicht die bash den Parameter *.doc interpretiert sondern, dass dieser zusammen mit der Option -name an find weiter gereicht wird musst du quoten ("*.doc")
http://www.linuxfibel.de/bash.htm#Quoting

3)
Für folgenden fall sieht die syntax für alle enthaltenen Parameter keine braces vor

Code: Alles auswählen

find ./ -type f ! -name "*.mp3"
Somit ist es logisch das durch NICHT vorhanden sein kein Fehler entstehen konnte.
  • die negation ist POSIX standart und auch in find implementiert - siehe man find ---> Operators - boolsche "Operationen" mit find sind natürlich möglich.
  • ein quoten ist nicht notwendig - siehe syntax man find
@all
4)
es steht alles weiß auf schwarz in den man pages zu find - kein grund wie die Hühner zu gackern womit einer den anderen verwirrt.

markus

Antworten