[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Kleines Scripting-Problem



Am Donnerstag 29 November 2007 schrieb Marc Deichmann:
> find /PATH -type f -mtime +30 -exec rm -f {} \;

Die Manpage zu find gibt zu diesem Anwendungszweck das folgende Beispiel:

find /tmp -name core -type f -print0 | xargs -0 /bin/rm -f

       Find  files  named  core  in  or  below the directory /tmp and
       delete them, processing filenames in such a way that  file  or
       directory  names containing single or double quotes, spaces or
       newlines are correctly handled.  The -name test  comes  before
       the  -type  test  in  order to avoid having to call stat(2) on
       every file.

Ich erinnere mich sogar dunkel daran, in der find-Manpage mal eine Warnung 
gelesen zu haben, dass man -exec so ohne weiteres nicht mit rm verwenden 
sollte. Den genauen Grund weiß ich allerdings nicht mehr. Es gibt 
allerdings auch schon mindestens eine Diskussion dazu, ah, okay, das ist 
die Sache, dass rm für jede Datei aufgerufen wird, wie auch eine zweite 
Fundstelle zeigt[1][2].

Ich hatte auch dunkel im Kopf, dass es Probleme geben könnte, wenn 
Einträge eines Verzeichnisses gelöscht werden, während find es 
durchsucht, aber dazu finde ich jetzt nichts. Zudem wäre es mit einem 
gepipten xargs ja auch nicht wirklich anders. Was jemand dazu was?

Zu dem von Heiko empfohlenen -delete steht in der Manpage:

 -delete
              Delete  files;  true  if  removal  succeeded.   If  the
              removal  failed,  an  error  message is issued.  Use of
              this action automatically turns on the '-depth' option.

Und die -depth Option macht Folgendes:

       -depth Process  each directory's contents before the directory
              itself.

Ah und ich glaube zu verstehen, wozu das gut ist: Wenn find einen rm erst 
auf der Verzeichnis löslässt, das noch Dateien enthält, die weitere 
rm-Aufrufe jedoch löschen würden, wird das Verzeichnis nicht gelöscht, es 
sei denn man ruft rm -r auf, das jedoch dann alle Dateien im Verzeichnis 
wegräumen würde, auch die, die find evtl. nicht findet.

Die Lösung mit -delete gefällt mir daher doch am besten. Oder eben xargs 
bzw. -exec rm + mit der Option -depth.

[1] 
http://groups.google.com/group/de.comp.os.unix.shell/browse_thread/thread/60a7af964022cf42

[2] http://www.pro-linux.de/t_shell/xargs.html

-- 
Martin 'Helios' Steigerwald - http://www.Lichtvoll.de
GPG: 03B0 0D6C 0040 0710 4AFA  B82F 991B EAAC A599 84C7

Attachment: signature.asc
Description: This is a digitally signed message part.


Reply to: