按用户对 ls 输出进​​行排序

按用户对 ls 输出进​​行排序

在Linux上,有没有办法ls按用户对输出进行排序?我试图实现的目标是这样的:

用户_A   文件1
用户_A   文件2
用户_   another_file
用户_C   这个_文件
用户_C   that_文件
用户_d   文件3

我知道这样的列表还包含文件大小、权限等——我主要关心的是用户的排序。会很方便,不是吗

到目前为止,我发现ls -l | sort -k 3按第三列排序,其中[如果使用ls -l]包含文件所有者[因此sort -k 4按组排序]。

如果文件所有者不在第三行怎么办?还有其他方法吗实现这一点,与列数无关


更新: 我忘记说了我在 BASH 工作并从现在开始尝试坚持一段时间,这样事情就不会变得更加复杂。

答案1

在不知道哪个是哪个的情况下从单个输出确定所有者名称位于哪一列ls -l是不可能的。您可以尝试将每列中的条目与passwd文件进行匹配,但不能保证您不会匹配组列或文件名列,这两者只能包含您在 中找到的名称/etc/passwd

如果您想使用ls,您可以运行该程序两次,一次 as ls -l,一次 as ls -g。后者会删除所有者,因此通过根据其他信息匹配行,您将能够确定所有者名称而无需指定。然而,这并不是我乐意在 bash shell 脚本中进行的练习。

答案2

使用zsh,您可以定义排序顺序并将其用于全局限定符,例如:

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

... *(no+uid)

n对于数字顺序,o对于命令+uid与函数一起订购uid)。这个想法是有一个函数,它接受一个文件名$REPLY并返回一些$REPLY内容zsh

因此,以 GNU 为例ls

ls -ldU -- *(no+uid)

对于仅限 GNU 的工具,相当于:

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

答案3

不解析ls: 使用stat

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

答案4

1)确定名称是哪一列:

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

它将变量 zeuser 放入显示用户名的列中,
我还确定 zesize=column 保存大小,zename=column 保存文件名

我将把 ls 命令放在一个变量中,这样确定列的行将使用稍后使用的实际命令(如果您更改它并且它更改了列出的列)

2)使用 sort 对该列进行排序:

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

相关内容