Ligne de commande: canalisation trouver les résultats vers rm

140

J'essaye de travailler sur une commande qui supprime les fichiers SQL de plus de 15 jours.

La partie find fonctionne mais pas le rm.

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

Il supprime une liste d'exactement les fichiers que je veux supprimer mais ne les supprime pas. Les chemins sont corrects.

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

Qu'est-ce que je fais mal?

jerrygarciuh
la source

Réponses:

274

Vous transmettez en fait rmla sortie de find. Ce que vous voulez, c'est utiliser la sortie de findcomme arguments pour rm:

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

xargsest la commande qui "convertit" son entrée standard en arguments d'un autre programme, ou, comme ils le mettent plus précisément sur la manpage,

construire et exécuter des lignes de commande à partir d'une entrée standard

Notez que si les noms de fichiers peuvent contenir des espaces, vous devez corriger cela:

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

Mais en fait, finda un raccourci pour cela: l' -deleteoption:

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

Veuillez tenir compte des avertissements suivants dans 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 Notez que le transfert direct vers rmn'est pas une option, car rmne s'attend pas à des noms de fichiers sur l'entrée standard. Ce que vous faites actuellement, c'est de les faire reculer.

Lev Levitsky
la source
1
Merci. J'ai lu la page de manuel et j'ai essayé ce drapeau. Je passe un chemin complet mais je reviens "/ usr / www2 / bar / htdocs / foo / rsync / httpdocs / db_backups /: chemin relatif potentiellement non sûr". Une idée pourquoi?
jerrygarciuh
1
@jerrygarciuh jetez un œil ici .
Lev Levitsky
Merci. Je ne suis pas sûr d'avoir bien suivi le message, mais quand j'ai émulé leur solution et mis -delete à la fin de la commande, il a supprimé tous les fichiers sql indépendamment de l'heure du mod ... mais il n'avait pas d'avertissement donc je suppose c'est progrès ...
jerrygarciuh
1
@jerrygarciuh Aïe, j'espère que rien de précieux n'a été perdu ... mandit: 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.Je ne sais pas comment cela importerait compte tenu des autres options que vous avez utilisées, mais avez-vous essayé cela?
Lev Levitsky
Non, je ne l'ai pas fait mais rien n'a été perdu. Ces fichiers sont synchronisés à partir d'un autre serveur sur lequel ils sont également stockés.
jerrygarciuh
26
find /usr/www/bar/htdocs -mtime +15 -exec rm {} \;

Sélectionne les fichiers de /usr/www/bar/htdocsplus de 15 jours et les supprime.

Suresh
la source
Je préfère votre réponse à celle acceptée à cause de "l'espace dans le nom". Il est mieux géré avec la commande "-exec" qu'avec pipe. Merci.
Slim Aloui
3

Une autre méthode plus simple consiste à utiliser la locatecommande. Ensuite, dirigez le résultat vers xargs.

Par exemple,

locate file | xargs rm
Gautam Sreekumar
la source
2

En supposant que vous ne soyez pas dans le répertoire contenant les fichiers de sauvegarde * .sql:

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

L'option -v ci-dessus est pratique, elle affichera verbalement les fichiers supprimés au fur et à mesure de leur suppression.

J'aime lister les fichiers qui seront supprimés en premier pour être sûr. Par exemple:

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