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 f
archivos de tipo (no directorios) en el argumento de opción, ¿por qué? (Cuando entro ls -ld
en 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 -l
para 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 find
ingresar directorios a los que no puede acceder, puede usar ! -executable -prune
:
find . ! -executable -prune -type f ! -user "$USER"
La -executable
prueba negada será verdadera para los directorios a los que no tiene acceso y -prune
los eliminará del find
árbol de búsqueda, impidiendo que la utilidad intente acceder a ellos y evitando así generar errores de permisos.
La -executable
prueba (así como sus análogas -readable
y -writable
pruebas) 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ó.