Linuxでは方法がありますか?ls
ユーザー別の出力ソート?私が達成しようとしているものは次のとおりです。
ユーザー_ㅏ ファイル1
ユーザー_ㅏ ファイル2
ユーザー_第二
another_fileuser_ 氏
this_file_user_ 氏 that_ファイル
ユーザー_D ファイル3
私はそのようなリストにファイルサイズ、権限などが含まれていることを知っています。 - 私の主な関心事は、ユーザーごとに並べ替えることです。それでは便利ではないでしょうか?
これまで、[使用されている場合]ファイルの所有者を含む[したがってグループ別にソート]、ls -l | sort -k 3
3番目の列に基づいてソートすることがわかりました。ls -l
sort -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
答え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)