Hi Leute,
ich bearbeite gerade einige Übungsaufgaben und eine ist wie folgt.
Man soll alle Verzeichnisse rekursiv löschen, die leer sind.
Nach meinem Verständnis und der Manual Page sollte folgender Befehl eigentlich die Lösung sein :
(Ist meiner Meinung nach selbsterklärend)
find . -type d -empty -exec rm {};
Dennoch bekomme ich die Fehlermeldung :
find: Fehlendes Argument für >>-exec<<.
Könnt Ihr mit bitte weiterhelfen, wo der Fehler steckt ?
Danke und Grüße,
Raphael
Leere Verzeichnisse löschen
-
- Beiträge: 49
- Registriert: 19.02.2006 00:13:41
- Wohnort: Karlsruhe
- novalix
- Beiträge: 1909
- Registriert: 05.10.2005 12:32:57
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: elberfeld
Re: Leere Verzeichnisse löschen
Hola,
zweierlei gilt zu bedenken.
Zum einen möchtest Du Verzeichnisse löschen, was bedeutet, dass ein einfacher Aufruf von "rm" nicht hinreicht. Du musst dem Befehl die Option "-r" mitgeben.
Zum anderen ist die Syntax Deines find-Konstrukts nicht vollständig richtig. Schau noch mal in die manpage.
Der Befehl, der durch "-exec" aufgerufen wird, arbeitet die Argumentliste (dargestellt durch "{}") iterativ ab, bis er auf das spezielle Zeichen ";" trifft. Dieses Zeichen *muss* alleine stehen, d.h. durch einen whitespace character (Leerzeichen) abgetrennt sein von den geschweiften Klammern. Außerdem muss es in den meisten Fällen zusätzlich "escaped" werden durch "\" (Backslash).
Eine andere Möglichkeit ist es, die Argumentliste "{}" erst vollständig zu befüllen und dann in einem Rutsch an den Befehl zu übergeben. Dieses geschieht, wenn man statt eines Semikolons ein Plus-Zeichen ("+") abgetrennt durch einen whitespace hinter die Argumentliste setzt.
Im ersten Fall wird der Befehl nacheinander für jedes einzelne Argument ausgeführt:
Im zweiten Fall wird der Befehl nur einmal mit der vollständigen Argumentliste ausgeführt:
Probiere es aus!
zweierlei gilt zu bedenken.
Zum einen möchtest Du Verzeichnisse löschen, was bedeutet, dass ein einfacher Aufruf von "rm" nicht hinreicht. Du musst dem Befehl die Option "-r" mitgeben.
Code: Alles auswählen
niels@tristam:~/test$ mkdir loesch-mich
niels@tristam:~/test$ rm loesch-mich
rm: das Entfernen von 'loesch-mich' ist nicht möglich: Ist ein Verzeichnis
niels@tristam:~/test$ rm -r loesch-mich
niels@tristam:~/test$
Der Befehl, der durch "-exec" aufgerufen wird, arbeitet die Argumentliste (dargestellt durch "{}") iterativ ab, bis er auf das spezielle Zeichen ";" trifft. Dieses Zeichen *muss* alleine stehen, d.h. durch einen whitespace character (Leerzeichen) abgetrennt sein von den geschweiften Klammern. Außerdem muss es in den meisten Fällen zusätzlich "escaped" werden durch "\" (Backslash).
Eine andere Möglichkeit ist es, die Argumentliste "{}" erst vollständig zu befüllen und dann in einem Rutsch an den Befehl zu übergeben. Dieses geschieht, wenn man statt eines Semikolons ein Plus-Zeichen ("+") abgetrennt durch einen whitespace hinter die Argumentliste setzt.
Im ersten Fall wird der Befehl nacheinander für jedes einzelne Argument ausgeführt:
Code: Alles auswählen
rm -r dir1
rm -r dir2
rm -r dir3
...
Code: Alles auswählen
rm -r {dir1,dir2,dir3,..}
Das Wem, Wieviel, Wann, Wozu und Wie zu bestimmen ist aber nicht jedermannns Sache und ist nicht leicht.
Darum ist das Richtige selten, lobenswert und schön.
Darum ist das Richtige selten, lobenswert und schön.
-
- Beiträge: 36
- Registriert: 30.10.2018 14:18:35
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: Eitorf
Re: Leere Verzeichnisse löschen
Was ist mit fslint ?
Re: Leere Verzeichnisse löschen
find kann auch gleich mit -delete gestartet werden. spart das -exec.
-
- Beiträge: 49
- Registriert: 19.02.2006 00:13:41
- Wohnort: Karlsruhe
Re: Leere Verzeichnisse löschen
hi zusammen,
ich habs hinbekommen.
Danke Euch !
Folgender Befehl funktionioert :
find . -type d -empty -exec rmdir -p {} \;
Danke und Grüße,
R.
ich habs hinbekommen.
Danke Euch !
Folgender Befehl funktionioert :
find . -type d -empty -exec rmdir -p {} \;
Danke und Grüße,
R.
Re: Leere Verzeichnisse löschen
Es geht ja auch z. B. mit "| xargs". Kann mir und dem Threadstarter jemand erklären wo die Vor- bzw. Nachteile sind?
Re: Leere Verzeichnisse löschen
Afaik gibts da nicht wirklich einen unterschied.
Ich verwende eher -delete weils einfacher ist. müsste auch ein bisserl schneller gehen.
DIe reihenfolge ist da aber wichtig. (steht auch in der manpage)
xargs muss man aufpassen das man immer -print0 bei find und -0 bei xargs angibt:
sonst kann es probleme mit unicode geben
Wenn man arg viele ordner hat ist xargs auch nicht so toll, weil die cmdline dann voll werden kann. Unter Linux ist das limit ja recht hoch, aber afaik gibt es ja dort auch eins.
Ich verwende eher -delete weils einfacher ist. müsste auch ein bisserl schneller gehen.
DIe reihenfolge ist da aber wichtig. (steht auch in der manpage)
Code: Alles auswählen
find . -type d -empty -delete
Code: Alles auswählen
find . -type d -empty -print0 | xargs -0 rmdir
Wenn man arg viele ordner hat ist xargs auch nicht so toll, weil die cmdline dann voll werden kann. Unter Linux ist das limit ja recht hoch, aber afaik gibt es ja dort auch eins.