• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Befehl zum loeschen von best. Dateien in Unterverz. gesucht

da.cappo

Member
Hallo,
ich suche nach einem Befehl, den in auf mehrere Ebenen (Unterverzeichnisse) nutzen kann und der mir alle *.NEF dateien loescht.
Bisher bin ich immer ins Verzeichnis und habe mit
Code:
rm -rf *.NEF
geloesch.
Nun wollte ich das auf meinen gesamten Bilderordner ausweiten und und versuche
  • find . -name *NEF -exec rm -v {} \;
    find . -name *NEF -exec rm -rf {} \;
    find . -name NEF -exec rm -v {} \;
    find . -name *.NEF |xargs rm -rf
    find . -depth -name *.NEF -exec rm -fr {} \;
entsprechen mit *. oder nur . oder *
Leider will das nicht klappen. Im Netz finde ich leider nur aehnliche Scriptbrocken und Grundsaetliche zu "find".
-Kennt jemand gute Links zum Thema find ?
-Weiss jemand was ich verkehrt mache?

Vielen Dank schonmal,
Martin
 

RME

Advanced Hacker
Hallo,

Code:
> find . -iname "*.NEF" -print0 -exec rm {} ";"
Gruss,
Roland
 
OP
da.cappo

da.cappo

Member
Das tut. Herzlichen Dank!
Wirk zwar noch komplizierter. :???: Vielleicht erschliesst es sich mir ja irgendwann, wie sich derartige Prozessverkettungen zusammensetzen lassen ;-)

Ich mach den Fred noch nicht dicht. Vielleicht kennt jemand ja gute Links hierzu die er empfehlen kann :roll:

Merci nochmal Roland, fuer deine schnelle Hilfe!
 
A

Anonymous

Gast
Wirk zwar noch komplizierter
Vielleicht erschliesst es sich mir ja irgendwann, wie sich derartige Prozessverkettungen zusammensetzen lassen ;-)
Um nur mal den Unterschied zur verdeutlichen.

Code:
find . -iname "*.NEF" -print0 -exec rm {} ";"
zu
Code:
find . -name *NEF -exec rm -rf {} \;

Code:
find . -name
ist erstmal gleich, was das macht sollte schon klar sein. WEnn nicht dann müsste man sich mal etwas näher mit dem find Befehl aueinander setzen, sowas ist Grundwissen Stichwort Linuxfibel,
Schauen wir uns da mal den Unterschied Im Namenssuchmuster an. Es scheint ja nur eines davon zu funktionieren.
Code:
"*.NEF"
gegen
Code:
*.NEF
Das wird man so wohl nirgends wirklich sauber erklärt zu lesen bekommen. Das hat auch nichts mit dem find Befehl selbst zu tun.
Wenn du zum Beispiel
find / -name *.NEF
machen würde, das würde funktionieren wenn du dich zB im Rootverzeichnis befindest, Aber nicht wenn du dich beim Aufruf in einem Verzeichnis befindest, in dem es mehr als eine Dateien gibt die NEF am Ende haben. warum ist das so.

der Befehl
Code:
find verzeichnis -name *NEF
wird in der Shell ausgeführt. Die Shell wird die Befehlszeile untersuchen und dort als erstes eine ganze Menge Veränderungen vornehmen. Dort stößt die Bash auf *NEF und wird im aktuellen Verzeichnis alle Dateinamen die dazu passen dort in die Befehlszeile einsetzten und diese dann starten.

Code:
/usr/bin/find verzeichnis -name Datei1.NEF Datei2.NEF Datei3.NEF DATEI4.NEF
wenn find so gestartet wird, dann wird es bei Datei2.NEF meckern, weil dieses keine gültige Option von find ist. Ist im Verzeichnis nur eine Date.NEF oder gar keine, dann wird der Befehl funktioieren, weil die Bash dort nichts hinsetzten kann, das find nicht sauber interpretieren kann, weil die Optionen nicht durcheinander kommen.

Damit die Bash dort also keine Ersetzung mit möglichen Dateinamen vornimmt, wird der Ausdruck vor der Bash geschützt, und das macht man typischer Weise eben

Code:
-name "*.NEF"
als nächstes haben wir da in einer Zeile
Code:
-print0
wenn wir das nicht angeben würden würde find automatisch "-print" nehmen, der Unterschied ist in der Ausgabe, die find von den gefundenen Dateien liefert, bei "-print" wird an jede Dateinamensausgabe ein "Neues Zeilen Zeichen" also ein Zeilensprung angehängt. Jede gefundene Datei wird also in einer eigene Zeile ausgegeben.
bei "-print0" wird keine ZeilenUmbruchzeichen verwendet sondern NULL. Mit "NULL" ist hier der Hexadezimale Wert 0x00 gemeint, dieses Zeichen wird immer als das Ende einer Zeichenkette gewertet. Eine Zeichenkette kann ja auch Leerzeichen und Zeilen und Seitensprünge und alles mögliche noch mehr haben. Nur so kann definitiv festgelegt werden, hier ist definitiv Schluss.

Dieses -print0 wird nun bei find genau dort verwendet wo Zeichenketten zu erwarten sind, die eventuell solche "komischen" Zeichen beinhalten könnten, zb bei Dateinamen die einen Zeilensprung im Namen tragen könnten. Für die Aktionen gibt es dann auch passende Optionen die nur dann wirklich auch Dateinamen verwenden die "NULLterminiert" sind (zB bei xargs) . Eine solche Verarbeitungsfunktion für Nullterminierte Dateinamen fehlt aber hier, somit kann man sich streiten ob man dann auch "-print0" überhaupt benötigen würde, wenn es hinten sowieso niemand auswertet.

dann kommt erstmal
Code:
-exec rm -v
das dürfte klar sein was das macht auch "{}" dass sollte klar sein, gehört natürlich zu find, und das hier die gefundenen Dateinamen der Reihe nach eingesetzt werden.
Aber hinten haben wir noch den kleinen Unterschied
Code:
\;
oder
Code:
";"
und beides ist absolut gleich in der Auswirkung , es wird nur zum Abschluss der -exec Aktion zwindend ein ; bei find benötigt. Wenn ich dieses aber nicht wieder vor der Bash schütze, dann nimmt sich schon die Bash dieses ; und benutzt dieses als Trennzeichen für ihre Bashbefehle, find würde dann ohne dieses ; gestartet und produziert wieder eine Fehlermeldung. Wie ich das ; vor der Bash schütze durch \; oder ";" ist vollkommen Wurscht.

also alles kein Hexenwerk

robi
 
OP
da.cappo

da.cappo

Member
Hallo robi,
vielen herzlichen Dank, dass du dir die Muehe gemacht hast, das so ausfuehrlich zusammenzufassen.
Klasse.! Danke!
Nach deiner Ausfuehrung ist die Kette leicht zu verstehen und Macht Laune auf mehr.

viele Gruesse,
Martin
 
Oben