Vous cherchez à trouver tous les fichiers (récursivement) qui ont un trait de soulignement dans leur nom de fichier, puis supprimez-les via la ligne de commande.
9
C'est la variante la plus sûre et la plus rapide:
find /path -type f -name '*_*' -delete
Il ne nécessite pas de tuyauterie et ne casse pas si les fichiers contiennent des espaces, des caractères globaux ou tout autre élément susceptible d’être étouffé par d’autres constructions. La règle la plus simple à retenir ici est de ne jamais analyser la find
sortie . Et jamais grep
sur les noms de fichiers si vous voulez faire quelque chose avec eux plus tard. Vous pouvez faire presque n'importe quoi avec find
directement.
Voir aussi: Manuel GNU find
- Supprimer des fichiers
Cela inclut les répertoires considérés comme des fichiers. Certains des autres exemples utilisant xargs échoueront si le nom du fichier contient des espaces.
Si vous ne voulez que des fichiers réguliers:
la source
\+
au lieu de\;
votre commande sera plus rapide car il substituera le nom de tous les fichiers trouvés au lieu d'appelerrm
un à la fois.Bon, faisons cela progressivement.
Comme première étape, il s’agit simplement d’un exercice simple consistant à transmettre un caractère générique à la
find
commande, en se rappelant de le citer bien sûr et en exécutant larm
commande pour chaque fichier trouvé:Mais bien sûr, c'est terriblement inefficace. Il lance tout un
rm
processus pour chaque fichier individuel. Donc, bien que nous puissions faire un petit détour,\+
ce n’est pas ce que nous allons finir, prenons donc le chemin le plus court et introduisonsxargs
pour regrouper les noms de fichiers en groupes:Mais cela a deux failles de sécurité. Premièrement, si un nom de fichier trouvé commence par un signe moins,
rm
il le traitera comme une option de ligne de commande plutôt que comme un nom de fichier et générera une erreur. (La-exec rm {}
version a également ce problème.) Deuxièmement, les noms de fichiers contenant des espaces ne seront pas gérés correctement parxargs
. Donc, une autre itération est de rendre cela un peu plus à l'épreuve des balles:Et, bien sûr, il y a les fonctionnalités interactives de ce
rm
que vous ne voulez probablement pas:Les options
-print0
et-0
ne sont pas standards, mais GNUfind
etxargs
, ainsi que FreeBSDfind
etxargs
, les comprennent. Cependant, même cela peut être amélioré. Nous n'avons pas besoin de générer de processus supplémentaires. GNU et FreeBSDfind
peuvent appeler l’unlink(2)
appel système directement:En guise de dernière mesure préventive pour vous empêcher de faire plus que ce que vous aviez prévu dans certaines circonstances, rappelez-vous que le système de fichiers peut contenir plus que des fichiers normaux:
la source
find . -type f -regex ".*_.*" | xargs rm -f
l'explication
-type f
trouve que seuls les fichiers-regex ".*_.*"
sélectionne uniquement les fichiersxargs rm -f
contenant un trait de soulignement, puis supprime le fichier sélectionné de manière forcée (ne demande jamais avant de supprimer)la source
find . -type f -regex ".*_.*" -print0 | xargs -0 rm -f
mais cela ne permet toujours pas de gérer les répertoires