7 votes

Utiliser `find` pour supprimer

Donc, étant donné trois options...

  1. find .... -delete
  2. find .... | xargs rm ...
  3. find .... -exec rm ...;

ou des variantes de ceux-ci, quelle option est préférable ?
Je suppose qu'il n'y a pas de réponse toute faite, et qu'une situation spécifique dictera la meilleure option (veuillez les nommer !).

A la vôtre.

15voto

David Points 344

L'option 1 permet d'éviter le déclenchement de processus externes, ce qui est utile dans des conditions de stress.

L'option 2 donnera naissance à un seul xargs qui n'engendrera qu'autant de rm si nécessaire. Cette option est généralement utilisée avec -print0 y -0 afin de gérer les noms de fichiers avec des espaces et/ou des nouvelles lignes.

L'option 3 donnera naissance à un rm pour chaque fichier.

GNU find (ou toute version de find conforme à POSIX) permet une quatrième option, find .... -exec rm -r {} + qui s'exécutera rm avec le plus grand nombre possible de noms de fichiers afin de n'en créer qu'un nombre limité.

5voto

frameworkninja Points 628

Je préfère utiliser find ... > file.txt examiner le dossier de manière approfondie, puis utiliser find ... -delete donc je sais que les mêmes résultats seront supprimés (passer des arguments est pratiquement à l'épreuve des balles, en général).

2voto

Edi Points 1

Le sujet de la suppression des fichiers est abordé dans la section "Cleaning Up" de la documentation GNU findutils. Vous pouvez la lire sur votre système en utilisant "info find", ou dans Emacs. Vous pouvez également la consulter en ligne à l'adresse http://www.gnu.org/software/findutils/manual/html_node/find_html/Cleaning-Up.html#Cleaning-Up .

find .... -delete

C'est l'option la plus sûre (contre les courses de liens symboliques) et la plus performante (puisqu'il n'est pas nécessaire d'exécuter quoi que ce soit ou d'effectuer un changement de contexte lorsque le pipe buffer est plein). Mais gardez à l'esprit que -delete implique -depth.

find .... | xargs rm ...

Ceci est dangereux dans les situations où d'autres personnes ont un accès en écriture à l'arbre dans lequel vous faites le nettoyage. Par exemple, supposons que la commande find ait décidé que /var/tmp/scratch/me/.ssh/config correspond à ses besoins et qu'elle imprime donc ces noms sur stdout. La commande xargs lira cela et l'ajoutera à une structure de données. Peu de temps après (lorsque xargs aura lu le nombre d'octets indiqué par la valeur par défaut de l'option -s), xargs bifurquera et exécutera rm pour le supprimer. Cependant, il est possible qu'entre-temps, quelqu'un d'autre ait fait cela :

$ cd /var/tmp/scratch
$ mv me me.old
$ ln -s /root me

Ensuite, lorsque rm va supprimer /var/tmp/scratch/me/.ssh/config, il va lancer l'appel système unlink("/var/tmp/scratch/me/.ssh/config"). Comme le noyau résoudra le lien symbolique pour vous, cela équivaut à ce qu'il appelle unlink("/root/.ssh/config"). Si le processus xargs était exécuté en tant que root, alors /root/.ssh/config sera supprimé, malgré le fait que vous n'ayez pas spécifié -L sur la ligne de commande. Pour cette raison, si la sécurité est importante, utilisez -delete. Vous pouvez en savoir plus sur ce sujet dans la section "Security Considerations" du manuel GNU find.

find .... -exec rm ...;

Parce que cela implique également fork/exec, il a les mêmes problèmes de sécurité que je mentionne ci-dessus.

En bref, la seule raison de ne pas utiliser -delete est la compatibilité avec les systèmes qui ne supportent pas -delete.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X