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.
Utilisation:
find . ! -readable -Prune -o -print
ou plus généralement
find <paths> ! -readable -Prune -o <other conditions like -name> -print
Fonctionne avec: find (GNU findutils) 4.4.2 .
-readable
correspond aux fichiers lisibles. L'opérateur !
renvoie true lorsque test est false. Et ! -readable
correspond aux répertoires non lisibles (& fichiers).-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.-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.
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:
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.
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
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'
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.
Pipe stderr
to /dev/null
en utilisant 2>/dev/null
find . -name '...' 2>/dev/null
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
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
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.
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
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) .
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.
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.
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
- = 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
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.