Ligne de commande: recherche de résultats dans rm

J’essaie de trouver une commande qui supprime les fichiers SQL de plus de 15 jours.

La partie trouvaille fonctionne mais pas la rm.

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

Il affiche une liste exacte 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?

Vous êtes en train de rm la sortie de rm vers l’entrée de find . Ce que vous voulez, c’est utiliser la sortie de find comme arguments pour 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 cela est plus précis, sur la page de manuel,

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

Notez que si les noms de fichiers peuvent contenir des caractères d’espacement, vous devez corriger cela:

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

Mais en fait, find a un raccourci pour ceci: l’option -delete :

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

S’il vous plaît être conscient des avertissements suivants dans l’ 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 sursockets. Because -delete implies -depth, you cannot usefully use -prune and -delete together. 

PS Notez que la diffusion directe dans rm n’est pas une option, car rm n’attend pas de noms de fichiers sur une entrée standard. Ce que vous êtes en train de faire, c’est de les faire reculer.

 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.

Une autre méthode plus simple consiste à utiliser la commande de locate . Utilisez-le xargs .

Par exemple,

 locate file.txt | xargs rm locate *something* | xargs rm 

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 à supprimer lorsqu’ils sont supprimés.

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 {} \;