Geht das kürzer?

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
OldGod78
Beiträge: 190
Registriert: 20.04.2016 20:59:51
Kontaktdaten:

Geht das kürzer?

Beitrag von OldGod78 » 18.05.2016 22:06:10

Hallo nochmal. In meinem script lösche ich derzeit log Dateien so:

Code: Alles auswählen

cd /home/Ordner1/logs/
rm -r *.log
cd /home/Ordner2/logs/
rm -r *.log

usw
Doch geht es irgendwie, vielleicht mit "find", dass er alle *.log löscht die in einem bestimmten Ordner sind...?

TomL

Re: Geht das kürzer?

Beitrag von TomL » 18.05.2016 22:19:07

OldGod78 hat geschrieben:Hallo nochmal. In meinem script lösche ich derzeit log Dateien so:

Code: Alles auswählen

cd /home/Ordner1/logs/
rm -r *.log
cd /home/Ordner2/logs/
rm -r *.log
Doch geht es irgendwie, vielleicht mit "find", dass er alle *.log löscht die in einem bestimmten Ordner sind...?

Code: Alles auswählen

rm -r /home/Ordner1/logs/*.log
rm -r /home/Ordner2/logs/*.log
Ja, das geht mit dem find problemlos..... allerdings solltest Du Dich vor dem Löschen konkret NUR mit dem Suchergebnis von "find" befassen, damit nicht durch einen fahrlässigen Fehler auch noch etwas anderes gefunden und gelöscht wird.... u.U. ist das dann schmerzhaft. Also erst NUR das Suchergebnis sicherstellen, dannach und im zweiten Schritt dann löschen.

Benutzeravatar
MSfree
Beiträge: 11605
Registriert: 25.09.2007 19:59:30

Re: Geht das kürzer?

Beitrag von MSfree » 18.05.2016 22:48:25

OldGod78 hat geschrieben:Doch geht es irgendwie, vielleicht mit "find", dass er alle *.log löscht die in einem bestimmten Ordner sind...?

Code: Alles auswählen

find /home -name \*.log -exec rm {} \;

TomL

Re: Geht das kürzer?

Beitrag von TomL » 18.05.2016 23:09:39

Dieses find-Beispiel solltest Du besser nicht verwenden.... der löscht nicht nur die in personen-ungebundenen "Ordner?" gefundenen logs, sondern, wenn Du das als root machst, auch alle Logs in den user-homedirs. Bei mir wären das thunderbird-logs, palemoon, virtualbox, von irgendwelche diversen weiteren Programmen, sowie alle Files mit der extension "log", die wie via samba-home-dir-mount von der NAS kommen. Das war der Grund, warum ich hier auf ein Beispiel verzichtet habe ... :P .... bei solchen Aktionen ist es besser, sich konkret mit dem Programm zu befassen und es erst mal auf ein Dummy-Directory loslassen. :lol:

Benutzeravatar
Meillo
Moderator
Beiträge: 9232
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Geht das kürzer?

Beitrag von Meillo » 19.05.2016 07:07:58

TomL hat geschrieben:Dieses find-Beispiel solltest Du besser nicht verwenden....
Deine Warnung ist schon angemessen, aber es kommt letztlich darauf an, was der Fragende will. Er schreibt: ``alle *.log löscht die in einem bestimmten Ordner sind''. Rekursiv oder nicht? Die Rekursion bietet dir find(1), ansonsten reicht Globbing (mit dem Stern).

Das Homeverzeichnis des Users oder gar /home ist eher ein schlechtes Beispiel fuer diesen Anwendungsfall, denke ich. In einem normalen Setup wuerde man das dort kaum tun wollen.
MSfree hat geschrieben:

Code: Alles auswählen

find /home -name \*.log -exec rm {} \;
Ich hab's in einem anderen Thread schonmal vorgeschlagen und mich gleichzeitig gefragt ob es Gruende dagegen gibt:

Code: Alles auswählen

find /home -name \*.log -delete
... ausser, dass es `rm -r' entspricht.
Use ed once in a while!

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

Re: Geht das kürzer?

Beitrag von uname » 19.05.2016 08:08:52

Deine Lösung mit dem "cd ..." ist nicht nur umständlich lang, sondern auch noch gefährlich. Du solltest wo möglich immer absolute Pfade direkt in den Befehlen nutzen. Sollte z.B. dein "cd" mal fehlschlagen kann es zu hässlichen Seiteneffekten führen. Dein "rm -r *.log" geht noch. Aber ein "rm -rf *" unterhalb von "/" anstatt von "/home/Ordner1/logs" wäre fatal.

Benutzeravatar
MSfree
Beiträge: 11605
Registriert: 25.09.2007 19:59:30

Re: Geht das kürzer?

Beitrag von MSfree » 19.05.2016 09:03:55

TomL hat geschrieben:Dieses find-Beispiel solltest Du besser nicht verwenden.... der löscht nicht nur die in personen-ungebundenen "Ordner?" gefundenen logs, sondern, wenn Du das als root machst, auch alle Logs in den user-homedirs.
Was aber genau so gefordert war :wink:

Aber, wenn es dich beruhigt:

Man kann, bevor man

Code: Alles auswählen

find /home -name \*.log -exec rm {} \;
ausführt, zur Kontrolle erstmal

Code: Alles auswählen

find /home -name \*.log
ausführen und die Dateiliste überprüfen, ob sie der Anforderung genügt.

Aber mal ganz ehrlich, muß man wirklich jedem Benutzer vorkauen, daß beim Löschen etwas schief gehen kann? :facepalm:

Benutzeravatar
Meillo
Moderator
Beiträge: 9232
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Geht das kürzer?

Beitrag von Meillo » 19.05.2016 10:06:20

Was mir da noch auffaellt:
OldGod78 hat geschrieben:

Code: Alles auswählen

rm -r *.log
Dieses `-r' macht doch keinen Sinn. Das waere nur relevant, wenn es Verzeichnisse (!) gaebe, die auf `.log' enden. Mir scheint, dass man wollte, dass rm(1) rekursiv nach allen Dateien `*.log' sucht und diese loescht. Das kann rm(1) aber nicht. Dazu braucht man find(1).

(Die rm-Option `-r' macht nur Sinn, wenn die Argumente Verzeichnisse sind.)
Use ed once in a while!

OldGod78
Beiträge: 190
Registriert: 20.04.2016 20:59:51
Kontaktdaten:

Re: Geht das kürzer?

Beitrag von OldGod78 » 19.05.2016 16:16:06

danke!

wanne
Moderator
Beiträge: 7548
Registriert: 24.05.2010 12:39:42

Re: Geht das kürzer?

Beitrag von wanne » 19.05.2016 17:43:46

Hier noch bash only Syntax:

Code: Alles auswählen

rm /home/Ordner{1,2}/logs/*.log
rot: Moderator wanne spricht, default: User wanne spricht.

Benutzeravatar
Meillo
Moderator
Beiträge: 9232
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Geht das kürzer?

Beitrag von Meillo » 19.05.2016 18:02:43

wanne hat geschrieben:Hier noch bash only Syntax:

Code: Alles auswählen

rm /home/Ordner{1,2}/logs/*.log
Na, in diesem speziellen Fall geht's auch portabel:

Code: Alles auswählen

rm /home/Ordner[12]/logs/*.log
Nur im allgemeinen Fall braucht man den Bashism:

Code: Alles auswählen

rm /home/{Ordner1,Verzeichnis2,bla,blubb}/logs/*.log
... ausser es muss kein Einzeiler sein:

Code: Alles auswählen

for i in Ordner1 Verzeichnis2 bla blubb ; do
    rm /home/"$i"/logs/*.log
done
Use ed once in a while!

Colttt
Beiträge: 3012
Registriert: 16.10.2008 23:25:34
Wohnort: Brandenburg
Kontaktdaten:

Re: Geht das kürzer?

Beitrag von Colttt » 19.05.2016 20:38:56

Es geht auch rm /home/*/Logs/*.log

Gesendet von meinem MI 2S mit Tapatalk
Debian-Nutzer :D

ZABBIX Certified Specialist

Antworten