web-dev-qa-db-fra.com

Ligne de commande: résultats de recherche de tuyauterie vers rm

J'essaie de mettre au point une commande qui supprime les fichiers SQL de plus de 15 jours.

La partie recherche fonctionne mais pas la société.

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

Il dresse une liste des 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?

111
jerrygarciuh

En fait, vous dirigez rm's output vers l’entrée find. Ce que vous voulez, c'est utiliser le résultat de find comme arguments to rm:

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

xargs est 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 page man,

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

Notez que si les noms de fichier peuvent contenir des caractères d’espace, vous devez corriger ceci:

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

Mais en réalité, find a un raccourci pour cela: l'option -delete:

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

Veuillez prendre note 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.

P.S. Notez que le transfert direct vers rm n'est pas une option, car rm n'attend pas de noms de fichiers sur l'entrée standard. Ce que vous faites actuellement est de les rediffuser.

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

Va sélectionner les fichiers dans /usr/www/bar/htdocs plus de 15 jours et les supprimer.

23
Suresh

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

Par exemple,

locate file | xargs rm
2
Gautam

En supposant que vous n'êtes 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 en cours de suppression au fur et à mesure de leur suppression.

J'aime énumérer 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 {} \;
0
Nick Little