ordenar la salida de ls por usuarios

ordenar la salida de ls por usuarios

En Linux, ¿hay alguna manera deordenar lsla salida por usuarios? Lo que intento lograr es algo como esto:

usuario_a   archivo1
usuario_a   archivo2
usuario_b   otro_usuario_archivo_
C   este_archivo
usuario_C   ese_archivo
usuario_d   archivo3

Soy consciente de que una lista como esta también contendría el tamaño del archivo, permisos, etc.; mi principal preocupación es la clasificación por usuarios. Sería muy útil, ¿no?

Hasta ahora encontré ls -l | sort -k 3ordenar por la columna tres que [si se usa ls -l] contiene el propietario del archivo [para sort -k 4ordenar por grupo].

PERO¿Qué pasa si el propietario del archivo no está en la fila tres? ¿Hay otra manera delograr esto, independientemente del número de la columna?


Actualizar: Me olvidé de mencionar esoyo trabajo en bashY trata de seguir así durante bastante tiempo a partir de ahora para que las cosas no se compliquen más.

Respuesta1

Determinar en qué columna se encuentra el nombre del propietario a partir de una única ls -lsalida sin saber cuál es cuál no es posible. Puede intentar hacer coincidir las entradas de cada columna con el passwdarchivo, pero no hay garantía de que no coincida con la columna de grupo o la columna de nombre de archivo, que solo pueden contener los nombres que encuentre en /etc/passwd.

Si desea utilizar ls, puede ejecutar el programa dos veces, una como ls -ly otra como ls -g. Este último elimina al propietario, por lo que al hacer coincidir líneas basadas en otra información podrá determinar el nombre del propietario sin especificar. Sin embargo, este no es un ejercicio que me gustaría hacer en un script de shell bash.

Respuesta2

Con zsh, puede definir criterios de clasificación y usarlos en calificadores globales como:

zmodload zsh/stat
uid() zstat -A REPLY +uid -- $REPLY

... *(no+uid)

( npara orden numérico, oparaorden, +uidpara ordenar con la uidfunción). La idea es tener una función que tome un nombre de archivo $REPLYy devuelva algo que $REPLYse zshordene.

Así, por ejemplo con GNU ls:

ls -ldU -- *(no+uid)

Con herramientas exclusivas de GNU, el equivalente sería algo como:

find . ! -name . -prune -printf '%U\t%p\0' |
  sort -zn |
  tr '\0\n' '\n\0' |
  cut -f2- |
  tr '\0\n' '\n\0' |
  xargs -r0 ls -ldU

Respuesta3

no analizarls: usarstat

stat -c "%U %n" -- * | sort

Respuesta4

1) Determine qué columna es el nombre:

myls='ls -al'
echo '+' > /tmp/MYOWNFILE.$$  #so file will be of size 2, "+" and newline.
zeuser=$( $myls /tmp/MYOWNFILE.$$ | awk -v myname=$(whoami) '{ for (field=1;field<=NF;field++) { if ($field == myname) { print field ; break } } }' )
zesize=$( $myls /tmp/MYOWNFILE.$$ | awk '{ for (field=1;field<=NF;field++) { if ($field == 2) { print field ; break } } }' )
zename=$( $myls /tmp/MYOWNFILE.$$ | awk -v filename=/tmp/MYOWNFILE.$$ '{ for (field=1;field<=NF;field++) { if ($field == filename) { print field ; break } } }' )
rm /tmp/MYOWNFILE.$$

Puso en la variable zeuser la columna que muestra el nombre de usuario.
También determino zesize=columna que contiene el tamaño y zename=columna que contiene el nombre del archivo.

Pondré el comando ls en una variable, de modo que las líneas que determinan la columna utilicen el comando real que se usará más adelante (en caso de que lo cambie y cambie las columnas enumeradas)

2) use ordenar para ordenar en esa columna:

$myls | sort -k${zeuser},${zeuser}  #sort ONLY on column of usernames (see last example for bad alternative)
$myls | sort -k${zeuser},${zeuser} -k${zename},${zename} #sort on user, and then on filename
$myls | sort -k${zeuser},${zeuser} -k${zesize},${zesize}nr #sort on user, 
                            #  and then on size 
                            #modifiers: 'n'=order Numerically (and not alphabetically), 
                            #           'r'=Reverse order
$myls | sort -k${zeuser}    #sort STARTING FROM user column, which is probably not what you want!
                     #indeed the next column is probably the group, then the size...
                     #It will be sorting in a not so usefull way (especially as the
                     #  size will be sorted alphabetically instead of numerically)

información relacionada