Befehlszeile: Piping Find Ergebnisse zu rm

140

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

Der Find-Teil 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 wird eine Liste mit genau den Dateien angezeigt, die gelöscht werden sollen, aber nicht gelöscht werden. 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?

jerrygarciuh
quelle

Antworten:

274

Sie leiten rmden Ausgang tatsächlich an den Eingang von weiter find. Was Sie wollen, ist die Ausgabe von findals Argumente für rm:

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

xargsist der Befehl, der seine Standardeingabe in Argumente eines anderen Programms "konvertiert" oder, wie sie genauer auf die manSeite setzen,

Erstellen und Ausführen von Befehlszeilen aus Standardeingaben

Beachten Sie, dass Sie Folgendes korrigieren sollten, wenn Dateinamen Leerzeichen enthalten können:

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

Aber eigentlich findhat eine Abkürzung dafür: die -deleteOption:

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.

PS Beachten Sie, dass das direkte Weiterleiten an rmkeine Option ist, da rmbei der Standardeingabe keine Dateinamen erwartet werden. Was Sie gerade tun, ist, sie rückwärts zu leiten.

Lev Levitsky
quelle
1
Vielen Dank. Ich habe die Manpage gelesen und diese Flagge ausprobiert. Ich übergebe einen vollständigen Pfad, erhalte aber "/ usr / www2 / bar / htdocs / foo / rsync / httpdocs / db_backups /: relativer Pfad möglicherweise nicht sicher" zurück. Irgendeine Idee warum?
Jerrygarciuh
1
@ Jerrygarciuh werfen Sie einen Blick hier .
Lev Levitsky
Vielen Dank. Ich bin mir nicht sicher, ob ich dem Beitrag gut gefolgt bin, aber als ich ihre Lösung emuliert und -delete am Ende des Befehls gesetzt habe, wurden alle SQL-Dateien unabhängig von der Mod-Zeit gelöscht ... aber es gab keine Warnung, also denke ich Das ist ein Fortschritt ...
Jerrygarciuh
1
@jerrygarciuh Autsch, ich hoffe, nichts Wertvolles ging verloren ... mansagt: 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.Ich bin mir nicht sicher, wie das angesichts der anderen von Ihnen verwendeten Optionen von Bedeutung sein würde, aber haben Sie das versucht?
Lev Levitsky
Nein, habe ich nicht, aber nichts ging verloren. Diese Dateien werden von einem anderen Server synchronisiert, auf dem sie auch gespeichert sind.
Jerrygarciuh
26
find /usr/www/bar/htdocs -mtime +15 -exec rm {} \;

Wählt Dateien in mehr /usr/www/bar/htdocsals 15 Tagen aus und entfernt sie.

Suresh
quelle
Ich bevorzuge Ihre Antwort als die, die wegen des "Leerzeichens im Namen" akzeptiert wird. Mit dem Befehl "-exec" ist dies besser möglich als mit Pipe. Vielen Dank.
Slim Aloui
3

Eine andere einfachere Methode ist die Verwendung locate Befehls. Leiten Sie dann das Ergebnis an weiter xargs.

Beispielsweise,

locate file | xargs rm
Gautam Sreekumar
quelle
2

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 obige Option -v ist praktisch. Sie gibt ausführlich aus, welche Dateien beim Entfernen gelöscht werden.

Ich möchte 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 {} \;
Nick Little
quelle