it-swarm.com.de

Befehlszeile: Piping-Find-Ergebnisse an rm

Ich versuche, einen Befehl auszuarbeiten, der SQL-Dateien löscht, die älter als 15 Tage sind.

Der Suchteil funktioniert, aber nicht der RM.

rm -f | find -L /usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups -type f  \( -name '*.sql' \) -mtime +15

Es zeigt eine Liste der Dateien an, die gelöscht werden sollen, löscht sie jedoch nicht. Die Pfade sind korrekt. 

usage: rm [-f | -i] [-dIPRrvW] file ...
       unlink file
/usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups/20120601.backup.sql
...
/usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups/20120610.backup.sql

Was mache ich falsch?

111
jerrygarciuh

Sie leiten tatsächlich rms output zur Eingabe von find. Sie möchten die Ausgabe von find als arguments to rm verwenden:

find -type f -name '*.sql' -mtime +15 | xargs rm

xargs ist der Befehl, der seine Standardeingabe in Argumente eines anderen Programms "konvertiert" oder, wie sie es genauer auf die Seite man setzen,

befehlszeilen aus Standardeingabe erstellen und ausführen

Wenn Dateinamen Leerzeichen enthalten können, müssen Sie dies korrigieren:

find -type f -name '*.sql' -mtime +15 -print0 | xargs -0 rm

Tatsächlich hat find dafür eine Verknüpfung: die -delete-Option:

find -type f -name '*.sql' -mtime +15 -delete

Bitte beachten Sie die folgenden Warnungen in man find:

  Warnings:  Don't  forget that the find command line is evaluated
  as an expression, so putting -delete first will make find try to
  delete everything below the starting points you specified.  When
  testing a find command line that you later intend  to  use  with
  -delete,  you should explicitly specify -depth in order to avoid
  later surprises.  Because -delete  implies  -depth,  you  cannot
  usefully use -Prune and -delete together.

P.S. Beachten Sie, dass das direkte Piping zu rm keine Option ist, da rm keine Dateinamen für die Standardeingabe erwartet. Was Sie gerade tun, ist, sie rückwärts zu leiten.

221
Lev Levitsky
find /usr/www/bar/htdocs -mtime +15 -exec rm {} \;

Wählt Dateien in /usr/www/bar/htdocs aus, die älter als 15 Tage sind, und entfernt sie.

23
Suresh

Eine andere einfachere Methode ist der Befehl locate. Leiten Sie das Ergebnis dann an xargs weiter.

Zum Beispiel,

locate file | xargs rm
2
Gautam

Angenommen, Sie befinden sich nicht in dem Verzeichnis, das die * .sql-Sicherungsdateien enthält:

find /usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups/*.sql -mtime +15 -exec rm -v {} \;

Die -v-Option oben ist praktisch, sie gibt ausführlich aus, welche Dateien beim Löschen gelöscht werden.

Ich möchte gerne die Dateien auflisten, die zuerst gelöscht werden, um sicherzugehen. Z.B:

find /usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups/*.sql -mtime +15 -exec ls -lrth {} \;
0
Nick Little