find test y bash test no dan el mismo resultado, ¿por qué?

find test y bash test no dan el mismo resultado, ¿por qué?

En mi pregunta anteriorEn find -exec, ¿cómo sustituir el archivo actual por {}?, He preguntado acerca de la prueba con find. Quiero encontrar todos los archivos que no me pertenecen. Entonces hay un comando de búsqueda adecuado:

find . -type f ! -user "$USER"

pero también debería serlo este:

find . -type f -exec bash -c '
    for pathname do
        [[ ! -O "$pathname" ]] && printf "%s\n" "$pathname"
    done' bash {} +

sin embargo, ambos dan resultados diferentes.

1) si lo hago [command one] | wc -c--> 4121

Pero: [command two] | wc -c--> 236768 (PD: estoy buscando archivos en mi $HOME).

Ambos dan números diferentes de cuántos archivos encontraron.

2) Ambos todavía dan archivos de resultados, que sondirectorios(sí, directorios que no me pertenecen y, por lo tanto, permiso denegado). Dan directorios a pesar de tener find . -type farchivos de tipo (no directorios) en el argumento de opción, ¿por qué? (Cuando entro ls -lden uno de esos directorios, ninguno es un enlace ni nada más)

Respuesta1

Hmm..., en mi directorio de inicio, ambos comandos funcionan igual. 8-/

Sin embargo, debes redirigir el stderr a /dev/null y usarlo wc -lpara contar correctamente la salida.

find . -type f ! -user "$USER" 2>/dev/null | wc -l
find . -type f -exec bash -c '
    for pathname do
        [[ ! -O "$pathname" ]] && printf "%s\n" "$pathname"
    done' 2>/dev/null bash {} + | wc -l

Desde aquí puede redirigir los resultados a archivos de texto y comparar los archivos para buscar diferencias.

find . -type f ! -user "$USER" 2>/dev/null > /tmp/file_1.txt
find . -type f -exec bash -c '
    for pathname do
        [[ ! -O "$pathname" ]] && printf "%s\n" "$pathname"
    done' 2>/dev/null bash {} + >/tmp/file_2.txt
diff /tmp/file_{1,2}.txt

Si hay diferencias, tome algunos de los archivos sobrantes de /tmp/file_2.txt e investigue más a fondo por qué el archivo no se considera "Verdadero si el archivo existe y es propiedad de la identificación de usuario efectiva".

Respuesta2

Para evitar tener que findingresar directorios a los que no puede acceder, puede usar ! -executable -prune:

find . ! -executable -prune -type f ! -user "$USER"

La -executableprueba negada será verdadera para los directorios a los que no tiene acceso y -prunelos eliminará del findárbol de búsqueda, impidiendo que la utilidad intente acceder a ellos y evitando así generar errores de permisos.

La -executableprueba (así como sus análogas -readabley -writablepruebas) no son estándar y requieren GNU find.

No puedo (todavía) decir nada sobre las diferencias en los resultados, ya que usted no ha dicho nada al respecto. Dado que el tamaño de la salida varía tan drásticamente, debería ser trivial encontrar y examinar casos en los que un comando encontró algo que el otro no encontró.

información relacionada