Leere Verzeichnisse löschen

Warum Debian und/oder eine seiner Spielarten? Was muss ich vorher wissen? Wo geht es nach der Installation weiter?
Antworten
freebeasty
Beiträge: 49
Registriert: 19.02.2006 00:13:41
Wohnort: Karlsruhe

Leere Verzeichnisse löschen

Beitrag von freebeasty » 06.06.2019 10:54:22

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

Benutzeravatar
novalix
Beiträge: 1909
Registriert: 05.10.2005 12:32:57
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: elberfeld

Re: Leere Verzeichnisse löschen

Beitrag von novalix » 06.06.2019 13:37:29

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.

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$ 
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:

Code: Alles auswählen

rm -r dir1
rm -r dir2
rm -r dir3
...
Im zweiten Fall wird der Befehl nur einmal mit der vollständigen Argumentliste ausgeführt:

Code: Alles auswählen

rm -r {dir1,dir2,dir3,..}
Probiere es aus!
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.

Andy64
Beiträge: 35
Registriert: 30.10.2018 14:18:35
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Eitorf

Re: Leere Verzeichnisse löschen

Beitrag von Andy64 » 06.06.2019 14:10:59

Was ist mit fslint ?

reox
Beiträge: 2464
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

Re: Leere Verzeichnisse löschen

Beitrag von reox » 06.06.2019 14:22:25

find kann auch gleich mit -delete gestartet werden. spart das -exec.

freebeasty
Beiträge: 49
Registriert: 19.02.2006 00:13:41
Wohnort: Karlsruhe

Re: Leere Verzeichnisse löschen

Beitrag von freebeasty » 06.06.2019 15:11:00

hi zusammen,

ich habs hinbekommen.

Danke Euch !

Folgender Befehl funktionioert :

find . -type d -empty -exec rmdir -p {} \;

Danke und Grüße,
R.

uname
Beiträge: 12075
Registriert: 03.06.2008 09:33:02

Re: Leere Verzeichnisse löschen

Beitrag von uname » 06.06.2019 15:23:57

Es geht ja auch z. B. mit "| xargs". Kann mir und dem Threadstarter jemand erklären wo die Vor- bzw. Nachteile sind?

reox
Beiträge: 2464
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

Re: Leere Verzeichnisse löschen

Beitrag von reox » 06.06.2019 21:02:40

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)

Code: Alles auswählen

find . -type d -empty -delete
xargs muss man aufpassen das man immer -print0 bei find und -0 bei xargs angibt:

Code: Alles auswählen

find . -type d -empty -print0 | xargs -0 rmdir
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.

Antworten