902 votes

Comment puis-je exclure tous les messages "permission refusée" de "find" ?

J'ai besoin de cacher tous les messages "permission refusée" de :

find . > files_and_folders

J'expérimente quand un tel message se présente. Je dois rassembler tous les dossiers et fichiers auxquels il ne s'applique pas. Est-il possible d'orienter les niveaux de permission vers le files_and_folders fichier ? Comment puis-je masquer les erreurs en même temps ?

0 votes

Grande question ! Malheureusement, les trois premi�res réponses ne fonctionnent tout simplement pas sous Debian Linux. Ou du moins sur ma configuration. J'avais besoin de la solution de Fatih, find /. -name 'toBeSearched.file' 2>/dev/null .

0 votes

J'ai trouvé qu'il était préférable d'exclure les /proc en utilisant le -path option. Elle permet de neutraliser le -prune pour éviter d'imprimer les éléments élagués.

607voto

Jonathan Leffler Points 299946

Utilisez :

find . 2>/dev/null > files_and_folders

Cela permet de masquer non seulement les erreurs de permission refusée, bien sûr, mais aussi tous les messages d'erreur.

Si vous voulez vraiment conserver d'autres erreurs possibles, telles que trop de sauts sur un lien symbolique, mais pas les erreurs liées à un refus d'autorisation, vous devrez probablement supposer que vous n'avez pas beaucoup de fichiers appelés 'permission denied' et essayer :

find . 2>&1 | grep -v 'permission denied' > files_and_folders

10 votes

Si vous êtes comme moi, remarquez que le manque d'espace est important ! 2>/dev/null sans espace !

23 votes

Le site 2> est une unité unique sans aucun espace ; vous pouvez avoir un espace entre lui et le nom du fichier. De même avec d'autres redirections, telles que 2>&1 (qui redirige l'erreur standard au même endroit que la sortie standard), ou 2>&- qui ferme l'erreur standard, etc. Voir Redirections pour les autres détails sanglants. (Le code ci-dessus est un shell générique de type POSIX, non spécifique à bash .)

3 votes

J'ai dû utiliser un P majuscule parce que c'est ce que mon terminal affichait : find . 2>&1 | grep -v 'Permission denied' (Permission refusée)

304voto

user3701456 Points 31

Utilisez :

find . ! -readable -prune
  • pour éviter "Permission refusée"
  • ET ne supprime pas les (autres) messages d'erreur
  • ET obtenir le statut de sortie 0 ("tous les fichiers sont traités avec succès")

Fonctionne avec : find (GNU findutils) 4.4.2

Le contexte :

Le test "-readable" correspond aux fichiers lisibles. L'opérateur " !" renvoie vrai, lorsque le test est faux. Et " ! -readable" correspond aux répertoires non lisibles (&files).

L'action "-prune" ne descend pas dans le répertoire.

" ! -readable -prune" peut être traduit par : si le répertoire n'est pas lisible, ne pas y descendre.

Le test "-readable" prend en compte les listes de contrôle d'accès et autres artefacts de permissions que le test -perm ignore.

voir aussi la page de manuel find(1) pour beaucoup, beaucoup plus de détails ...

1 votes

En quoi cela est-il meilleur ou pire que la réponse de Jonathan ? Les deux ont-elles les mêmes résultats ?

6 votes

Les différences sont déjà mentionnées. si vous ne comprenez pas, alors les réponses ne font peut-être aucune différence pour vous ? STDOUT est le même - STDERR est différent (vous obtenez les autres messages d'erreur avec cette réponse) - $ ? est différent (est 0 "réussi" avec cette réponse, quand aucune autre erreur ne se produit - est toujours > 0 "non réussi" lors de la redirection vers dev/null) - peut-être quelqu'un a besoin de $ ? "correct" dans un script.

5 votes

Je pense que c'est la solution la plus élégante du fil. J'aime le résultat réussi.

121voto

Fatih Aksu Points 477

Si vous souhaitez lancer une recherche à partir de la racine "/", vous obtiendrez probablement un résultat du type :

find: /./proc/1731/fdinfo: Permission denied
find: /./proc/2032/task/2032/fd: Permission denied

C'est à cause de la permission. Pour résoudre ce problème :

1) Vous pouvez utiliser la commande sudo : sudo find /. -name 'toBeSearched.file' . il demande le mot de passe du super utilisateur, quand vous entrez le mot de passe vous verrez le résultat que vous voulez vraiment.

2) Vous pouvez utiliser la redirection de la sortie d'erreur standard de (généralement affichage/écran) vers un fichier quelconque et éviter de voir les messages d'erreur à l'écran ! redirection vers un fichier spécial /dev/null :

find /. -name 'toBeSearched.file' 2>/dev/null

3)Vous pouvez rediriger la sortie d'erreur standard de (généralement affichage/écran) vers la sortie standard (généralement affichage/écran), puis utiliser la commande grep avec le paramètre -v "invert" pour ne pas voir les lignes de sortie qui ont des paires de mots "Permission refusée" :

find /. -name 'toBeSearched.file' 2>&1 | grep -v 'Permission denied'

8 votes

@scottmrogowski sauf que cela ne répond pas à la question... 1. demandez à l'administrateur système de vous ajouter au fichier sudoers. 2. sudo find...

4 votes

Exactement ce que je cherchais !

1 votes

Cela faisait longtemps que je n'avais pas trouvé la bonne réponse après avoir lu quatre réponses très votées, longues d'une page et toutes incorrectes. Merci !

104voto

Jeremy Points 361

J'ai dû utiliser :

find / -name expect 2>/dev/null

en spécifiant le nom de ce que je voulais trouver, puis en lui disant de rediriger toutes les erreurs vers /dev/null

expect étant l'emplacement du programme expect que je recherchais.

3 votes

@Masi, la commande dans la réponse n'utilise pas expect . Au lieu de cela, expect est simplement le nom du fichier que cette commande va essayer de trouver.

2 votes

Rediriger aveuglément toute la sortie stderr juste pour ignorer une seule classe de messages d'erreur est généralement une mauvaise idée - vous perdrez toutes les autres erreurs arbitraires dans le processus.

31voto

sdaau Points 6262

Vous pouvez également utiliser le -perm et -prune pour éviter de descendre dans des répertoires illisibles (voir aussi Comment supprimer les mentions d'impression "permission refusée" du programme find ? - Unix & Linux Stack Exchange ) :

find . -type d ! -perm -g+r,u+r,o+r -prune -o -print > files_and_folders

4 votes

-perm -g+r,u+r,o+r ne fait que correspondre aux fichiers qui ont l'extension r (lecture) pour les 3 éléments de l'interface utilisateur. du fichier de sécurité, ce qui n'a pas de relation directe avec le fait de savoir si la utilisateur actuel peut lire ce fichier ou non. Il est possible de rater des fichiers que l'utilisateur actuel ne peut pas lire. peut et de faire correspondre les fichiers qu'ils ne peuvent pas lire.

0 votes

Je pense find . -type d ! \( -perm -u+r -o -perm -g+r -o -perm -o+r \) -prune -o -print serait la bonne solution.

2 votes

@Mattia72 : Non, il est fondamentalement impossible d'émuler complètement -readable avec -perm - voir mon commentaire précédent et considérer cet exemple : echo 'hi' > file; sudo chown nobody:nobody file; sudo chmod o-r file; find file -perm -u=r imprime file parce que son bit de lecture par l'utilisateur est activé, mais il se rapporte à l'indicateur de performance de l'utilisateur. nobody et non l'utilisateur actuel. L'utilisateur actuel ne peut pas lire ce fichier ; essayez cat file . Voir aussi : cette réponse de la mienne.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X