ユーザー別にls出力を並べ替える

ユーザー別にls出力を並べ替える

Linuxでは方法がありますか?lsユーザー別の出力ソート?私が達成しようとしているものは次のとおりです。

ユーザー_   ファイル1
ユーザー_   ファイル2
ユーザー_第二
another_fileuser_  
this_file_user_     that_ファイル
ユーザー_D   ファイル3

私はそのようなリストにファイルサイズ、権限などが含まれていることを知っています。 - 私の主な関心事は、ユーザーごとに並べ替えることです。それでは便利ではないでしょうか?

これまで、[使用されている場合]ファイルの所有者を含む[したがってグループ別にソート]、ls -l | sort -k 33番目の列に基づいてソートすることがわかりました。ls -lsort -k 4

しかし、ファイル所有者が3行目にない場合はどうなりますか?別の方法がありますか?列数に関係なくこれを達成します。


修正する:言うのを忘れました。私はBASHで働いています。そして、状況がより複雑にならないように、これからしばらくこれに固執するように努めてください。

答え1

どの列がどちらであるかを知らずに、単一の出力で所有者名がどの列にあるかを確認するls -lことはできません。各列の項目をファイルと一致させることができますが、passwdグループ列またはファイル名列が一致しないという保証はありません。両方で見つかった名前のみを含めることができます/etc/passwd

を使用するには、lsプログラムを2回実行するだけです。一度はasで、ls -l一度はasで実行できますls -g。後者は所有者を削除するので、他の情報に基づいて行を一致させると、所有者名を指定せずに所有者名を解決できます。しかし、これはbashシェルスクリプトで実行できる練習ではありません。

答え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)

関連情報