按使用者對 ls 輸出進行排序

按使用者對 ls 輸出進行排序

在Linux上,有沒有辦法ls依使用者對輸出進行排序?我試圖實現的目標是這樣的:

使用者_A   文件1
用戶_A   文件2
用戶_   另一個文件
用戶_C   這個文件
用戶_C   那個文件
使用者_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)

相關內容