Question Comment puis-je exclure tous les messages "permission denied" de "find"?


J'ai besoin de cacher tout permission refusée messages de:

find . > files_and_folders

J'expérimente quand un tel message apparaît. J'ai besoin de rassembler tous les dossiers et les fichiers, auxquels il ne se pose pas.

Est-il possible de diriger les niveaux d'autorisation vers le files_and_folders fichier?

Comment puis-je cacher les erreurs en même temps?


671
2018-04-17 21:54


origine


Réponses:


Remarque:
* Cette réponse va probablement plus loin que le cas d'utilisation, et find 2>/dev/null peut être assez bon dans de nombreuses situations. Cela peut encore être intéressant pour une perspective multiplateforme et pour la discussion de certaines techniques de coque avancées dans le but de trouver une solution aussi robuste que possible, même si les cas auxquels on se confronte peuvent être en grande partie hypothétiques.
* Si votre système est configuré pour afficher localisé messages d'erreur, préfixe le find appelle ci-dessous avec LC_ALL=C (LC_ALL=C find ...) pour être sur de Anglais les messages sont signalés, de sorte que grep -v 'Permission denied' fonctionne comme prévu. Invariablement, cependant, tous les messages d'erreur faire être affiché sera alors en anglais aussi bien.

Si ton shell est bash ou zsh, il y a une solution robuste tout en étant raisonnablement simple, en utilisant seulement conforme POSIX find fonctionnalités; tandis que bash lui-même ne fait pas partie de POSIX, la plupart des plates-formes Unix modernes l'accompagnent, rendant cette solution largement portable:

find . > files_and_folders 2> >(grep -v 'Permission denied' >&2)

Note: Il y a une petite chance que certains de grepla sortie peut arriver après  find se termine, car la commande globale n'attend pas la commande à l'intérieur >(...) pour finir. Dans bash, vous pouvez éviter cela en ajoutant | cat à la commande.


161
2017-10-31 03:51



Utilisation:

find . 2>/dev/null > files_and_folders

Cela cache non seulement Permission denied erreurs, bien sûr, mais tous les messages d'erreur.

Si vous voulez vraiment garder d'autres erreurs possibles, comme trop de sauts sur un lien symbolique, mais pas les permissions refusées, alors vous devrez probablement supposer que vous n'avez pas beaucoup de fichiers appelés 'permission denied' et essaye:

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

Si vous voulez strictement filtrer juste erreur standard, vous pouvez utiliser la construction plus élaborée:

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

La redirection d'E / S sur le find commande est: 2>&1 > files_and_folders |. Le tuyau redirige la sortie standard vers le grep commande et est appliquée en premier. le 2>&1 envoie l'erreur standard au même endroit que la sortie standard (le tuyau). le > files_and_folders envoie la sortie standard (mais pas l'erreur standard) à un fichier. Le résultat net est que les messages écrits à l'erreur standard sont envoyés dans le tuyau et la sortie régulière de find est écrit dans le fichier. le grep filtre la sortie standard (vous pouvez décider à quel point vous voulez qu'elle soit sélective, et changer l'orthographe en fonction des paramètres régionaux et du système d'exploitation) >&2 signifie que les messages d'erreur survivants (écrits sur la sortie standard) retournent à l'erreur standard une fois de plus. La redirection finale pourrait être considérée comme optionnelle au terminal, mais serait une très bonne idée de l'utiliser dans un script afin que les messages d'erreur apparaissent sur l'erreur standard.

Il y a des variations infinies sur ce thème, en fonction de ce que vous voulez faire. Cela fonctionnera sur n'importe quelle variante d'Unix avec n'importe quel dérivé de shell Bourne (Bash, Korn, ...) et n'importe quelle version compatible POSIX de find.

Si vous souhaitez adapter à la version spécifique de find vous avez sur votre système, il peut y avoir d'autres options disponibles. GNOU find en particulier a une myriade d'options non disponibles dans d'autres versions - voir la réponse actuellement acceptée pour un tel ensemble d'options.


499
2018-04-17 21:57



Utilisation:

find . ! -readable -prune -o -print

ou plus généralement

find <paths> ! -readable -prune -o <other conditions like -name> -print
  • pour éviter "Permission refusée"
  • ET ne supprime PAS (autre) les 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. Contexte:

  • le -readable test correspond à des fichiers lisibles. le ! L'opérateur retourne vrai, quand test est faux. Et ! -readable correspond à des répertoires non lisibles (& fichiers).
  • le -prune l'action ne descend pas dans le répertoire.
  • ! -readable -prune peut être traduit en: si le répertoire n'est pas lisible, ne le descendez pas.
  • le -readable test prend en compte les listes de contrôle d'accès et d'autres artefacts d'autorisations que le -perm test ignore.

Voir aussi la page de manuel find (1) pour plus de détails.


248
2017-08-11 00:44



Si vous voulez lancer la recherche depuis la racine "/", vous verrez probablement quelque chose comme:

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

C'est à cause de la permission. Pour résoudre ceci:

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

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

    find /. -name 'toBeSearched.file' 2>/dev/null
    
  3. Vous pouvez utiliser rediriger la sortie d'erreur standard de (affichage général / écran) vers la sortie standard (affichage général / écran), puis rediriger la commande grep avec le paramètre -v "invert" pour ne pas voir les lignes de sortie avec "autorisation refusée" paires de mots:

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

104
2018-02-15 08:27



Je devais utiliser:

find / -name expect 2>/dev/null

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

Je m'attends à être le lieu du programme attendu que je cherchais.


83
2018-02-04 02:29



Tuyau stderr à /dev/null en utilisant 2> / dev / null

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


50
2018-04-17 21:59



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

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

29
2018-03-23 15:08



Rediriger l'erreur standard. Par exemple, si vous utilisez bash sur une machine Unix, vous pouvez rediriger l'erreur standard vers / dev / null comme ceci:

find . 2>/dev/null >files_and_folders

22
2018-04-17 21:57



Alors que les approches ci-dessus ne traitent pas le cas pour Mac OS X, car Mac Os X ne prend pas en charge -readable changer c'est comme ça que vous pouvez éviter les erreurs 'Permission denied' dans votre sortie. Cela pourrait aider quelqu'un.

find / -type f -name "your_pattern" 2>/dev/null.

Si vous utilisez une autre commande avec find, par exemple, pour trouver la taille des fichiers d'un certain motif dans un répertoire 2>/dev/null fonctionnerait toujours comme indiqué ci-dessous.

find . -type f -name "your_pattern" -exec du -ch {} + 2>/dev/null | grep total$.

Cela renverra la taille totale des fichiers d'un modèle donné. Noter la 2>/dev/null à la fin de la commande find.


19
2018-02-01 22:57