Comment puis-je supprimer les relevés d'impression «autorisation refusée» du programme find?

38

Code

find / -name netcdf

Sortie

find: `/root/.dbus': Permission denied
find: `/root/.gconf': Permission denied
find: `/root/.gconfd': Permission denied
find: `/root/.gnome': Permission denied
find: `/root/.gnome2': Permission denied
find: `/root/.gnome2_private': Permission denied
InquilineKea
la source
Connexes: unix.stackexchange.com/q/290791/16920
Léo Léopold Hertz 준영

Réponses:

35

Ces messages sont envoyés à stderr, et seuls ces messages sont généralement vus sur ce flux de sortie. Vous pouvez le fermer ou le rediriger sur la ligne de commande.

$ find / -name netcdf 2>&-

ou

$ find / -name netcdf 2>/dev/null

En outre, si vous souhaitez effectuer une recherche dans le répertoire racine (/), il est souvent bon d’améliorer le processus afin que la recherche ne consomme pas toutes les ressources.

$ nice find / -name netcdf 2>&-

Cela diminue la priorité du processus, ce qui laisse plus de temps aux autres processus. Bien sûr, si rien d'autre n'utilise le processeur, il ne fait rien. :) Pour être technique, la valeur NI (vue de ps -l) augmente la valeur PRI. Les valeurs PRI inférieures ont une priorité plus élevée. Comparez ps -lavec nice ps -l.

Arcege
la source
1
Je n'aime pas jeter des avertissements. Il vaut beaucoup mieux les gérer. En outre, pas d'échapper ici sur le terrain.
Léo Léopold Hertz 준영
1
@ LéoLéopoldHertz 준영 WEll ... si vous ne pouvez pas voir la sortie du programme parce que votre écran est plein de merde d'erreur .. ce qui est le cas ...
17h14
20

Je voudrais juste souligner cette réponse de @Gilles dans les chemins d’exclusion qui permettent à Find de se plaindre des autorisations - Unix et Linux Stack Exchange ; cela implique fondamentalement une construction findqui empêche les répertoires illisibles de descendre et, dans ce sens, est probablement aussi un peu plus rapide.

Cela semblerait fonctionner pour moi:

Avec GNU findou tout autre findsupportant les prédicats -readableet -executable:

find / -type d ! \( -readable -executable \) -prune -o -type f -name netcdf -print

ou aussi ceci:

find / -type d ! -perm -g+r,u+r,o+r -prune -o -type f -name 'netcdf' -print

Pour une raison quelconque, je dois ajouter tous les g+r,u+r,o+rraccourcis ( a+rsinon, si l'un d'entre eux est laissé de côté, il se peut que je reçoive des occurrences "Permission Denied".

Voici un aperçu de la façon dont je vois ceci (notez que l' -aopérateur (et) findest implicite entre deux prédicats ):

find /         # find starting from path /
  -type d        # match type is directory
  ! -perm -a+r   # (and) match not permissions of `r`ead present 
  -prune         # ignore what matched above and do not descend into it
  -o             # or (whatever didn't match above)
  -type f        # match type is file
  -name 'netcdf' # (and) match name is 'netcdf'
  -print         # print what matched above

Notez que sans le dernier -print, je reçois quelques objets supplémentaires (qui n'ont rien à voir avec -name 'netcdf'); les -printassure que seuls les matches de nom sont imprimés ( le cas échéant).

Sdaau
la source
2
Si find(1)vous ne pouvez pas descendre dans un répertoire, ce ne sera pas le cas. Donc, vérifier au préalable si cela peut ou non ajoute simplement du travail (vérifier deux fois), et donc le ralentir.
vonbrand
3
@vonbrand est nécessaire si vous comptez sur findl'état de sortie, car ces erreurs d'autorisation rendent les findsorties avec un statut différent de zéro
Ernest A
Je ne peux pas obtenir votre travail de proposition. Je n'obtiens aucune sortie lorsque la sortie attendue est pleine. unix.stackexchange.com/q/290791/16920 Cependant, je pense que sinon, je pense que votre méthode est la meilleure voie à suivre.
Léo Léopold Hertz 준영
1
Wow, je ne peux pas croire que c'était si difficile de trouver cette réponse, j'aimerais maintenant pouvoir faire plus que simplement la revigorer.
Wedge
8

Utilisez à la locate(1)place:

$ locate netcdf

Il ne vous montrera que les fichiers que votre utilisateur peut voir.

Warren Young
la source
1
Cela suppose qu’il updatedbfonctionne régulièrement. Ce n'est pas le cas sur tous les systèmes Linux.
Arcege
3
Si loc (1) est installé, sa base de données doit être mise à jour périodiquement. Si cela ne se produit pas, je considérerais cela comme une mauvaise configuration plutôt qu'une faute de localisation (1). En outre, l’exécution manuelle ne prend que quelques minutes dans les rares cas où vous recherchez un fichier ajouté depuis la dernière mise à jour de la base de données. Je me trouve à faire cela environ une demi-douzaine de fois par an, des frais généraux faciles à payer pour l'avantage de vitesse de localiser (1) par rapport à trouver (1).
Warren Young