classificar ls saída pelos usuários

classificar ls saída pelos usuários

No Linux, existe uma maneira declassificar lsa saída por usuários? O que tento alcançar é algo assim:

do utilizador_a   arquivo1
usuário_a   arquivo2
usuário_b   outro_arquivo
usuário_c   este_arquivo
usuário_c   esse_arquivo
usuário_d   arquivo3

Estou ciente de que uma listagem como esta também conteria tamanho de arquivo, permissões, etc. – minha principal preocupação é a classificação por usuários. Seria muito útil, não é?

Até agora, descobri ls -l | sort -k 3classificar pela coluna três, que [se estiver usando ls -l] contém o proprietário do arquivo [para sort -k 4classificar por grupo].

MASe se o proprietário do arquivo não estiver na linha três? Existe outra maneira deconseguir isso, independente do número da coluna?


Atualizar:esqueci de mencionar issoEu trabalho no BASHe tente mantê-lo por um bom tempo daqui em diante para que as coisas não se tornem mais complicadas.

Responder1

Determinar em qual coluna o nome do proprietário está a partir de uma única ls -lsaída sem saber qual é qual não é possível. Você pode tentar combinar as entradas em cada coluna com o passwdarquivo, mas não há garantia de que você não combinará a coluna do grupo ou a coluna do nome do arquivo, que só podem conter nomes encontrados em /etc/passwd.

Se você quiser continuar ls, poderá executar o programa duas vezes, uma vez como ls -le uma vez como ls -g. Este último elimina o proprietário, portanto, combinando linhas com base em outras informações, você poderá determinar o nome do proprietário sem especificação. No entanto, este não é um exercício que eu ficaria feliz em fazer em um script bash shell.

Responder2

Com zsh, você pode definir ordens de classificação e usá-las em qualificadores globais como:

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

... *(no+uid)

( npara ordem numérica, oparaordem, +uidpara solicitar com a uidfunção). A ideia é ter uma função que receba um nome de arquivo $REPLYe retorne algo $REPLYdesse zshtipo.

Então, por exemplo, com GNU ls:

ls -ldU -- *(no+uid)

Com ferramentas somente GNU, o equivalente seria 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

Responder3

Não analisels: usarstat

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

Responder4

1) Determine qual coluna é o nome:

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.$$

Colocou na variável zeuser a coluna que mostra o nome de usuário.
Também determino zesize=column contendo o tamanho e zename=column contendo o nome do arquivo

Colocarei o comando ls em uma variável, para que as linhas que determinam a coluna usem o comando real usado posteriormente (caso você o altere e ele altere a(s) coluna(s) listada(s)

2) use sort para classificar nessa coluna:

$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)

informação relacionada