web-dev-qa-db-fra.com

Supprimer récursivement les mêmes fichiers trouvés avec Locate

Il semble que cette question ait été posée de plusieurs façons. Mais je voudrais utiliser rm au lieu de find.

J'ai suivi un certain nombre d'explications sur la façon d'utiliser find, mais j'ai un problème avec l'exécution de la commande find. Lorsque j'utilise Locate, j'obtiens la sortie suivante:

maxgitt@mgpc:/etc$ locate omero
/etc/nginx/conf.d/omeroweb.conf
/etc/rc0.d/K01omero-web
/etc/rc1.d/K01omero-web
/etc/rc2.d/S03omero-web
/etc/rc3.d/S03omero-web
/etc/rc4.d/S03omero-web
/etc/rc5.d/S03omero-web
/etc/rc6.d/K01omero-web

Mais lorsque j'essaie d'utiliser find pour supprimer les fichiers respectifs, j'obtiens l'erreur suivante.

maxgitt@mgpc:/etc$ find -type f -name '*omero*'
./etc/rc0.d/K01omero-web
./etc/rc1.d/K01omero-web
./etc/rc2.d/S03omero-web
./etc/rc3.d/S03omero-web
./etc/rc4.d/S03omero-web
./etc/rc5.d/S03omero-web
./etc/rc6.d/K01omero-web
find: ‘./cups/ssl’: Permission denied
find: ‘./ppp/peers’: Permission denied
find: ‘./polkit-1/localauthority’: Permission denied
find: ‘./ssl/private’: Permission denied
./nginx/conf.d/omeroweb.conf
find: ‘./chatscripts’: Permission denied
find: ‘./docker’: Permission denied

J'ai donc opté à la place pour utiliser la commande:

maxgitt@mgpc:/etc$ Sudo rm -rf /etc/*/*omero-web*

Mais je préférerais pouvoir supprimer tous les fichiers dans le etc/ répertoire et ses sous-répertoires respectifs. Je me retrouve avec un fichier à cause de ma commande hacky rm:

maxgitt@mgpc:/etc$ locate omero
/etc/nginx/conf.d/omeroweb.conf
1
Max

Utilisez Sudo

Et faites toujours un essai avant de supprimer pour vous assurer de ne pas retirer plus que prévu.

Sudo find -type f -name '*omero*'

Ensuite, en supposant que la liste semble bonne

    Sudo find -type f -name '*omero*' -delete

ou spécifiez un emplacement à rechercher (vous savez déjà que ces fichiers se trouvent dans/etc)

Sudo find /etc -iname '*omero*' -delete

-delete est plus rapide que -exec rm {} \; ou -print0 | xargs -0 rm car il n'a pas à générer un autre processus.

EDIT: D'après les commentaires

for i in $(locate omero) ; do rm $i ; done
4
Panther

Il vous suffit d'ajouter le Sudo à votre commande:

Sudo find /etc -type f -name '*omero*' -delete

et l'erreur disparaîtra. La raison étant que ces fichiers appartiennent à root user et ne peut être supprimé que par ceux du groupe Sudo et l'utilisateur root.

3
George Udosen

Il existe de nombreuses raisons d'utiliser find plutôt que rm. Surtout si votre version de find prend en charge l'option "-delete":

  • Si vos noms de fichiers contiennent des espaces ou des retours à la ligne, votre commande rm ne fonctionnera pas et peut même supprimer les mauvais fichiers.
  • S'il y a beaucoup de fichiers à supprimer, la commande échouera pour avoir dépassé la longueur de ligne de commande maximale.

Si votre recherche prend en charge "-delete":

find -type f -path "*omero*" -delete

Si votre recherche ne prend pas en charge "-delete" et nécessite un chemin de départ:

find . -type f -path "*omero*" -print0 | xargs -0 rm

Cette '-print0 ... -0' est important. Cela indique à find de sortir les noms de fichiers délimités par NUL, et xargs -0 attendra les noms de fichiers délimités NUL. De cette façon, les espaces et les nouvelles lignes dans vos noms de fichiers ne causeront pas de problèmes.

De plus, j'utilise -path au lieu de -name pour mieux correspondre à ce que vous permet de localiser. Cependant, cela signifie qu'un fichier sera supprimé s'il se trouve sous un répertoire contenant "omero". Ce n'est probablement pas ce que vous voulez, et vous devriez utiliser -name au lieu.

Avec cela à l'écart, si vous êtes sûr de ce que vous avez obtenu à la fin, mettez Sudo au début de la première version. Ou Sudo à l'avant de find et xargs dans la seconde.

1
Chris Cogdon