web-dev-qa-db-fra.com

Comment puis-je exclure tous les messages "autorisation refusée" de "trouver"?

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

find . > files_and_folders

J'expérimente quand un tel message survient. Je dois rassembler tous les dossiers et fichiers, pour lesquels cela ne se produit pas. 

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

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

Utilisation:

find . 2>/dev/null > files_and_folders

Cela cache non seulement les erreurs Permission denied, bien sûr, mais 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 l'autorisation refusée, vous devrez probablement deviner que vous n'avez pas beaucoup de fichiers appelés 'autorisation refusée'. et essaye:

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

Si vous voulez uniquement filtrer l'erreur standard, vous pouvez utiliser la construction la plus élaborée:

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

La redirection d'E/S sur la commande find est la suivante: 2>&1 > files_and_folders |. Le canal redirige la sortie standard vers la commande grep et est appliqué 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 avec une erreur standard sont envoyés par le passé et que la sortie normale de find est écrite dans le fichier. La grep filtre la sortie standard (vous pouvez choisir le degré de sélectivité souhaité et il peut être nécessaire de modifier l'orthographe en fonction de la localisation et du système d'exploitation) et le >&2 final signifie que les messages d'erreur restants (écrits dans la sortie standard) à l'erreur standard une fois de plus. La redirection finale pourrait être considérée comme facultative sur le terminal, mais il serait très judicieux de l’utiliser dans un script afin que les messages d’erreur apparaissent en erreur standard.

Il y a d'innombrables variations sur ce thème, en fonction de ce que vous voulez faire. Cela fonctionnera sur toutes les variantes d'Unix avec tout dérivé de Bourne Shell (Bash, Korn,…) et toute version compatible avec POSIX de find .

Si vous souhaitez vous adapter à la version spécifique de find que vous avez sur votre système, d'autres options peuvent être disponibles. GNU find en particulier a une myriade d’options non disponibles dans les autres versions - voir la réponse actuellement acceptée pour un tel ensemble d’options.

517
Jonathan Leffler

Utilisation:

find . ! -readable -Prune -o -print

ou plus généralement

find <paths> ! -readable -Prune -o <other conditions like -name> -print
  • éviter "autorisation refusée" 
  • ET ne pas supprimer 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 test -readable correspond aux fichiers lisibles. L'opérateur ! renvoie true lorsque test est false. Et ! -readable correspond aux répertoires non lisibles (& fichiers).
  • L'action -Prune ne descend pas dans le répertoire.
  • ! -readable -Prune peut être traduit en: si le répertoire n'est pas lisible, n'y descendez pas.
  • Le test -readable prend en compte les listes de contrôle d'accès et autres artefacts d'autorisations que le test -perm ignore.

Voir aussi find (1) manpage pour plus de détails.

261
Michael Brux

Si vous voulez lancer la recherche à partir de la racine "/", vous verrez probablement des résultats 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 super utilisateur, lorsque vous entrez le mot de passe, vous verrez ce que vous voulez vraiment.

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

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

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

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

s’attendre à être l’emplacement du programme attendu que je cherchais.

86
Jeremy

Pipe stderr to /dev/null en utilisant 2>/dev/null

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

52
Matt

Vous pouvez également utiliser les prédicats -perm et -Prune pour éviter de descendre dans des répertoires illisibles (voir aussi Comment supprimer les instructions d'impression "autorisation refusée" du programme de recherche? - Unix et Linux Stack Exchange ):

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

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
23
Jason Coco

Bien que les approches ci-dessus ne traitent pas du cas de Mac OS X, car Mac Os X ne prend pas en charge le commutateur -readable, voici comment éviter des erreurs de type "autorisation refusée" 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, trouver la taille des fichiers de certains modèles 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 retournera la taille totale des fichiers d'un motif donné. Notez le 2>/dev/null à la fin de la commande find.

19
Bunti

Ces erreurs sont imprimées sur la sortie d'erreur standard (fd 2). Pour les filtrer, redirigez simplement toutes les erreurs vers/dev/null:

find . 2>/dev/null > some_file

ou rejoignez d’abord stderr et stdout puis extrayez ces erreurs spécifiques:

find . 2>&1 | grep -v 'Permission denied' > some_file
13
viraptor

Pour éviter seulement les avertissements relatifs à l'autorisation refusée, indiquez à find d'ignorer les fichiers illisibles en les supprimant de la recherche. Ajoutez une expression sous forme de OR à votre recherche, telle que

find / \! -readable -Prune -o -name '*.jbd' -ls

Ceci dit principalement de (correspond à un fichier illisible et l'élague de la liste) OR (correspond à un nom comme * .jbd et l'affiche [avec ls]) . (Rappelez-vous que par défaut, les expressions sont associées par AND, sauf si vous utilisez -or.) Vous avez besoin de -ls dans la deuxième expression, sinon find peut ajouter une action par défaut pour afficher l'une ou l'autre correspondance, ce qui vous indiquera également tous les fichiers illisibles. .

Mais si vous recherchez de vrais fichiers sur votre système, il n'y a généralement aucune raison de regarder dans/dev, qui contient beaucoup de fichiers. Vous devez donc ajouter une expression qui exclut ce répertoire, comme ceci:

find / -mount \! -readable -Prune  -o  -path /dev -Prune  -o  -name '*.jbd' -ls

So (correspond au fichier illisible et à l’élagage de la liste) OR (correspond au chemin/dev et à l’élagage de la liste) OR (correspond au fichier comme * .jbd et l'afficher) .

4
simpleuser

utilisation

Sudo find / -name file.txt

C'est stupide (parce que vous élevez la recherche) et non sécurisé, mais beaucoup plus court pour écrire.

4
mist

Aucune des réponses ci-dessus n'a fonctionné pour moi. Tout ce que je trouve sur Internet se concentre sur: cacher les erreurs. None gère correctement le processus code retour/code sortie. J'utilise la commande find dans les scripts bash pour localiser certains répertoires, puis inspecter leur contenu. J'évalue la commande trouver le succès en utilisant le code de sortie: une valeur zéro fonctionne, sinon échoue.

La réponse fournie ci-dessus par Michael Brux fonctionne parfois. Mais j'ai un scénario dans lequel cela échoue! J'ai découvert le problème et l'ai résolu moi-même. J'ai besoin d'élaguer des fichiers lorsque:

it is a directory AND has no read access AND/OR has no execute access

Voir la question clé ici est: ET/OU. Une bonne séquence de conditions suggérée que j'ai lue est:

-type d ! -readable ! -executable -Prune

Cela ne marche pas toujours. Cela signifie qu'un pruneau est déclenché lorsqu'une correspondance est:

it is directory AND no read access AND no execute access

Cette séquence d'expressions échoue lorsque l'accès en lecture est accordé mais pas l'accès en exécution.

Après quelques tests, j'ai réalisé à ce sujet et modifié ma solution de script Shell en:

Belle trouvaille/home */-maxdepth 5 -follow \
\(-type d -a !\(-readable -a -executable \) \) -Prune \
-o \
\(-type d -a -readable -a -executable -a -name "$ {m_find_name}" \) -print

La clé ici est de placer le "faux" pour une expression combinée:

has read access AND has execute access

Sinon, il ne dispose pas d'un accès complet, ce qui signifie: taillez-le. Cela s'est avéré efficace pour moi dans un scénario où les solutions suggérées précédemment avaient échoué.

Je fournis ci-dessous des détails techniques pour les questions de la section commentaires. Je m'excuse si les détails sont excessifs. 

  • Pourquoi utiliser la commande nice? J'ai eu l'idée ici . Au départ, je pensais que ce serait bien de réduire la priorité des processus lors de la recherche d’un système de fichiers complet. J'ai compris que cela n'avait aucun sens pour moi, car mon script est limité à quelques répertoires. J'ai réduit -maxdepth à 3.
  • Pourquoi rechercher dans/home * /? Ce n'est pas pertinent pour ce fil. J'installe toutes les applications manuellement via le code source compilé avec des utilisateurs non privilégiés (pas root) Ils sont installés dans "/ home". Je peux avoir plusieurs fichiers binaires et versions vivant ensemble. J'ai besoin de localiser tous les répertoires, d'inspecter et de sauvegarder de manière maître-esclave. Je peux avoir plusieurs "/ home" (plusieurs disques fonctionnant sur un serveur dédié). 
  • Pourquoi utiliser -follow? Les utilisateurs peuvent créer des liens symboliques vers des répertoires. Son utilité dépend, je dois garder une trace des chemins absolus trouvés.
2
Jordi Ferran

Vous pouvez utiliser le grep -v invert-match

-v, --invert-match        select non-matching lines

comme ça:

find . > files_and_folders
cat files_and_folders | grep -v "permission denied" > files_and_folders

Devrait à la magie

2
Leonardo Hermoso

- = Pour MacOS = -

Créez une nouvelle commande en utilisant alias: ajoutez simplement la ligne ~/.bash_profile:

alias search='find / -name $file 2>/dev/null'

et dans la nouvelle fenêtre du terminal, vous pouvez l'appeler:

$ file=<filename or mask>; search

par exemple:

$ file = etc; chercher

1
Jan aka uptech

Si vous utilisez CSH ou TCSH, voici une solution: 

( find . > files_and_folders ) >& /dev/null

Si vous voulez une sortie sur le terminal:

( find . > /dev/tty ) >& /dev/null

Cependant, comme le décrit "csh-whynot" FAQ, vous ne devez pas utiliser CSH.

0
Kayle Sawyer