
No Linux, existe uma maneira declassificar ls
a 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 3
classificar pela coluna três, que [se estiver usando ls -l
] contém o proprietário do arquivo [para sort -k 4
classificar 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 -l
saída sem saber qual é qual não é possível. Você pode tentar combinar as entradas em cada coluna com o passwd
arquivo, 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 -l
e 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)
( n
para ordem numérica, o
paraordem, +uid
para solicitar com a uid
função). A ideia é ter uma função que receba um nome de arquivo $REPLY
e retorne algo $REPLY
desse zsh
tipo.
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)