Encuentra todos los archivos y directorios con un grupo diferente al propietario

0

Quiero encontrar todos los archivos y directorios que tienen un grupo diferente del propietario.

Entonces, si estos fueran los dos archivos en el directorio, me gustaría encontrar el primero:

$> ls -l
-rw-rw-r--. 1 user175 group192  866 Dec 12  2006 index.htm
-rw-r--r--. 1 user175 user175   921 Dec 14  2006 index2.html

He estado jugando con find, pero estoy empezando a pensar que voy a tener que darme por vencida y escribir algún tipo de guión (realmente preferiría no escribir un guión).

Gracias por adelantado.

Jistanidiot
fuente
Hay un miles de directorios en linux. ¿Estás seguro de que quieres hacer esto por todos ¿directorios existentes en su máquina? ¿O para los específicos? Si esto último, entonces la tarea es mucho más fácil.
Fanatique

Respuestas:

1
find . -exec sh -c '
      stat -c "%U %G" "$1" |
      awk -F " " "\$1==\$2{exit 1}"
   ' sh {} \; -print

Corre stat Por cada objeto, recupera su propietario y grupo. awk luego regresa el estado de salida 0 Sólo si difieren. En efecto solo se imprimen estos.

Notas:

  • El rendimiento es bajo. Cada objeto necesita su propio separado. sh, stat y awk. Tuve algunas ideas para mejorar esto ( find . -exec stat … {} + | awk … ) pero no estoy seguro de poder hacer que sean lo suficientemente robustos para trabajar con posibles nombres de archivo con nuevas líneas, etc. Decidí jugar de forma segura. Puedes usar -print0 si es necesario. Este enfoque también le permite agregar más condiciones a find.
  • En mi kubuntu stat -c "%U %G" devoluciones UNKNOWN para UID (o GID) que no se pueden traducir a nombres. Si hay un usuario UNKNOWN o un grupo UNKNOWN, esto va a interferir, creo. Un objeto regresando UNKNOWN UNKNOWN Se interpreta ingenuamente para tener propietario y grupo coincidentes.
Kamil Maciorowski
fuente
Esto lleva una eternidad incluso en un directorio con pocos archivos, pero parece funcionar en todos los casos. Gracias.
Jistanidiot
0

Bueno, encontré una solución diferente que usa ls y awk en lugar de encontrar Y esto sin duda necesita y puede ser optimizado. Aquí va :

ls -alR | awk '{ if ($3 != $4) print $0 }'

Cómo funciona :

  • Mira qué -alR hace de man ls
  • awk busca el patrón.
  • $3 &erio; $4 correspondientemente da 3 rd &erio; 4 th Columna en salida de ls que son file owner y group ese dueño es parte de
  • $0 Da línea completa en salida ls.
  • Condición if ($3 != $4) print $0 interpreta a "Imprimir línea completa con todas las columnas en donde el valor es 3 rd columna no es igual a valor en 4 th columna
  • El comando completo se puede interpretar como Imprima solo las líneas en la salida ls donde el nombre del propietario del archivo y el nombre del grupo no sean los mismos .

Limitación

A veces, da este error para algunos archivos:

ls: cannot open directory './chatscripts': Permission denied

Según tengo entendido, es un problema de permiso con el usuario desde el que se ejecuta el comando. El usuario no es propietario ni parte del grupo para ese archivo y, por lo tanto, no puede acceder a él.


Lo que quieras se puede hacer definitivamente con find comando, pero creo que esto también puede ser una solución y también seguirá habiendo este problema de permiso Si lo haces con find mando.

Siéntase libre de añadir más detalles.

C0deDaedalus
fuente
Esto parece funcionar hasta que golpea uno de los nombres de archivos / directorios problemáticos como se menciona en "por qué no debe analizar la salida de ls".
Jistanidiot