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?
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.
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 locate
. Ensuite, dirigez le résultat vers xargs
.
Par exemple,
locate file | 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 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 {} \;