Pregunta ¿Cómo puedo excluir todos los mensajes de "permiso denegado" de "buscar"?


Necesito esconder todo Permiso denegado mensajes de:

find . > files_and_folders

Estoy experimentando cuando surge ese mensaje. Necesito reunir todas las carpetas y archivos, para lo cual no aparece.

¿Es posible dirigir los niveles de permiso a la files_and_folders ¿archivo?

¿Cómo puedo ocultar los errores al mismo tiempo?


671
2018-04-17 21:54


origen


Respuestas:


Nota:
* Esta respuesta probablemente sea más profunda que las justificaciones del caso de uso, y find 2>/dev/null puede ser lo suficientemente bueno en muchas situaciones. Todavía puede ser de interés para una perspectiva multiplataforma y para su discusión de algunas técnicas de shell avanzadas en el interés de encontrar una solución que sea lo más robusta posible, incluso si los casos protegidos pueden ser en gran parte hipotéticos.
* Si su sistema está configurado para mostrar localizado error de mensajes, prefijo el find llama a continuación con LC_ALL=C (LC_ALL=C find ...) para asegurar eso Inglés los mensajes se informan, de modo que grep -v 'Permission denied' funciona según lo previsto. Invariablemente, sin embargo, cualquier mensaje de error que hacer get display también estará en inglés.

Si tu cáscara es bash o zsh, hay una solución que es robusta a la vez que razonablemente simple, utilizando solo cumple con POSIX find caracteristicas; mientras bash en sí mismo no es parte de POSIX, la mayoría de las plataformas Unix modernas vienen con él, lo que hace que esta solución sea ampliamente portátil:

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

Nota: hay una pequeña posibilidad de que algunos de grepla salida de s puede llegar después  find completa, porque el comando general no espera el comando dentro >(...) para terminar. En bash, puedes evitar esto agregando | cat al comando.


161
2017-10-31 03:51



Utilizar:

find . 2>/dev/null > files_and_folders

Esto oculta no solo el Permission denied errores, por supuesto, pero todos los mensajes de error.

Si realmente desea evitar otros posibles errores, como demasiados saltos en un enlace simbólico, pero no los permisos denegados, entonces probablemente tenga que adivinar que no tiene muchos archivos llamados 'permiso denegado'. y prueba:

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

Si estrictamente quiere filtrar el error estándar, puede usar la construcción más elaborada:

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

La redirección de E / S en find comando es: 2>&1 > files_and_folders |. La tubería redirige la salida estándar a la grep comando y se aplica primero. los 2>&1 envía el error estándar al mismo lugar que la salida estándar (la tubería). los > files_and_folders envía salida estándar (pero no error estándar) a un archivo. El resultado neto es que los mensajes escritos a error estándar se envían por la tubería y la salida regular de find está escrito en el archivo. los grep filtra el resultado estándar (puede decidir qué tan selectivo lo quiere y puede tener que cambiar la ortografía según la configuración regional y las O / S) y el final >&2 significa que los mensajes de error supervivientes (escritos en la salida estándar) vuelven al error estándar. La redirección final podría considerarse como opcional en la terminal, pero sería una buena idea usarla en una secuencia de comandos para que los mensajes de error aparezcan en el error estándar.

Hay infinitas variaciones en este tema, dependiendo de lo que quieras hacer. Esto funcionará en cualquier variante de Unix con cualquier derivado de shell de Bourne (Bash, Korn, ...) y cualquier versión compatible con POSIX de find.

Si desea adaptarse a la versión específica de find tiene en su sistema, puede haber opciones alternativas disponibles. ÑU find en particular, tiene una miríada de opciones que no están disponibles en otras versiones; consulte la respuesta actualmente aceptada para un conjunto de opciones de este tipo.


499
2018-04-17 21:57



Utilizar:

find . ! -readable -prune -o -print

o más en general

find <paths> ! -readable -prune -o <other conditions like -name> -print
  • para evitar "Permiso denegado"
  • Y NO suprimir (otros) mensajes de error
  • Y obtenga el estado de salida 0 ("todos los archivos se procesan correctamente")

Funciona con: find (GNU findutils) 4.4.2. Fondo:

  • los -readable prueba coincide con archivos legibles los ! el operador devuelve verdadero, cuando la prueba es falsa Y ! -readable coincide con directorios no legibles (y archivos).
  • los -prune la acción no desciende al directorio.
  • ! -readable -prune se puede traducir a: si el directorio no es legible, no descienda a él.
  • los -readable prueba tiene en cuenta las listas de control de acceso y otros artefactos de permisos que el -perm la prueba ignora

Consulte también encontrar la página de manual (1) para obtener más información.


248
2017-08-11 00:44



Si desea iniciar la búsqueda desde la raíz "/", probablemente verá resultados como:

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

Es por el permiso. Para resolver esto:

  1. Puedes usar el comando sudo: sudo find /. -name 'toBeSearched.file'. pregunta la contraseña del super usuario, cuando ingrese la contraseña verá el resultado que realmente desea.

  2. Puede usar redirigir la salida de error estándar desde (generalmente pantalla / pantalla) a algún archivo y evitar ver los mensajes de error en la pantalla. redirigir a un archivo especial / dev / null:

    find /. -name 'toBeSearched.file' 2>/dev/null
    
  3. Puede usar redirigir la salida de error estándar desde (generalmente pantalla / pantalla) a salida estándar (generalmente pantalla / pantalla), luego canalizar con comando grep con el parámetro -v "invertir" para no ver las líneas de salida que tienen 'Permiso denegado' pares de palabras:

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

104
2018-02-15 08:27



Tuve que usar:

find / -name expect 2>/dev/null

especificando el nombre de lo que quería encontrar y luego diciéndole que redirija todos los errores a / dev / null

espero ser la ubicación del programa esperado que estaba buscando.


83
2018-02-04 02:29



Tubo stderr a /dev/null mediante el uso 2> / dev / null

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


50
2018-04-17 21:59



También puedes usar el -perm y -prune predicados para evitar descender a directorios ilegibles (ver también ¿Cómo elimino las declaraciones impresas de "permiso denegado" del programa de búsqueda? - Unix y 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



Redirigir error estándar. Por ejemplo, si está utilizando bash en una máquina Unix, puede redirigir el error estándar a / dev / null así:

find . 2>/dev/null >files_and_folders

22
2018-04-17 21:57



Si bien los enfoques anteriores no abordan el caso de Mac OS X porque Mac Os X no es compatible -readable cambie esta es la forma en que puede evitar los errores de "Permiso denegado" en su salida. Esto podría ayudar a alguien.

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

Si está utilizando algún otro comando con find, por ejemplo, para encontrar el tamaño de los archivos de cierto patrón en un directorio 2>/dev/null seguiría funcionando como se muestra a continuación.

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

Esto devolverá el tamaño total de los archivos de un patrón dado. Nota la 2>/dev/null al final del comando encontrar.


19
2018-02-01 22:57



Esos errores se imprimen en la salida de error estándar (fd 2). Para filtrarlos, simplemente redirige todos los errores a / dev / null:

find . 2>/dev/null > some_file

o primero, únase a stderr y stdout y luego agote esos errores específicos:

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

13
2018-04-17 22:00



Respuesta simple:

find . > files_and_folders 2>&-

2>&- cierra (-) el descriptor de archivo de error estándar (2) por lo que todos los mensajes de error se silencian.

  • El código de salida seguirá siendo 1 Si alguna 'Permission denied'errores de lo contrario se imprimirían

Respuesta robusta para GNU find:

find . -type d \! \( -readable -executable \) -prune -print -o -print > files_and_folders

Pasar opciones adicionales a find ese -prune (evitar descender) pero aún -print cualquier directorio (-typed) eso no es (\!) tener ambos -readable y -executable permisos, o (-o) -print cualquier otro archivo.

  • -readable y -executable Las opciones son extensiones de GNU, no son parte del Estándar POSIX
  • Todavía puede regresar 'Permission denied'en archivos anormales / corruptos (p. ej., consulte informe de error afectando sistemas de archivos montados en contenedores utilizando lxcfs <v2.0.5)

Respuesta robusta que funciona con cualquier compatible con POSIX find (GNU, OSX / BSD, etc.)

{ LC_ALL=C find . 3>&2 2>&1 1>&3 > files_and_folders | grep -v 'Permission denied'; [ $? = 1 ]; } 3>&2 2>&1

Usar una tubería pasar el flujo de error estándar a grep, eliminando todas las líneas que contienen 'Permission denied' cuerda.

LC_ALL=C establece el Localidad POSIX usando un Variable ambiental, 3>&2 2>&1 1>&3 y 3>&2 2>&1  descriptores de archivos duplicados para canalizar el flujo de error estándar a grepy [ $? = 1 ] usos [] para invertir el código de error devuelto por grep para aproximar el comportamiento original de find.

  • También filtrará cualquier 'Permission denied' errores debidos a la redirección de salida (por ejemplo, si files_and_folders el archivo en sí no es modificable)

10
2017-12-25 04:17