ls 出力をユーザー別にソートする

ls 出力をユーザー別にソートする

Linuxでは、lsユーザー別に出力をソートする私が達成しようとしているのは次のようなことです:

ユーザー_1つの   ファイル1
ユーザー_1つの   ファイル2
ユーザー_b   別のファイル
ユーザーc   このファイル
ユーザーc   そのファイル
ユーザーd   ファイル3

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

これまでのところ、ls -l | sort -k 3列 3 で並べ替える方法を見つけました ([ を使用している場合ls -l]、これにはファイル所有者が含まれます [したがって、sort -k 4グループで並べ替える])。

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


アップデート: 言い忘れていました私はBASHで働いています物事がさらに複雑にならないように、これからしばらくはそれを続けるようにしてください。

答え1

どれがどれであるかを知らずに、単一の出力から所有者名がどの列にあるかを判断することls -lは不可能です。各列のエントリをファイルと一致させることはできますpasswdが、グループ列またはファイル名列の両方に一致しないという保証はありません。これらの列には、 で見つかった名前のみが含まれている可能性があります/etc/passwd

を使用する場合はls、プログラムを として 1 回、 としてls -l1 回と、計 2 回実行できますls -g。後者は所有者を削除するので、他の情報に基づいて行を一致させることにより、指定しなくても所有者名を判別できます。ただし、これは bash シェル スクリプトで喜んで実行できる作業ではありません。

答え2

を使用するとzsh、ソート順序を定義し、次のようにグロブ修飾子で使用できます。

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

... *(no+uid)

n番号順o注文、関数+uidで順序付けしますuid)。アイデアは、ファイル名を受け取り、並べ$REPLY替えた何かを返す関数を持つことです。$REPLYzsh

たとえば、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=サイズを保持する列とzename=ファイル名を保持する列も決定します。

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)

関連情報