사용자별로 ls 출력 정렬

사용자별로 ls 출력 정렬

리눅스에서는 방법이 있나요?ls사용자별로 출력 정렬? 내가 달성하려는 것은 다음과 같습니다.

사용자_   파일 1
사용자_   파일 2
사용자_두번째
another_fileuser_  
this_file_user_     that_파일
사용자_   파일 3

나는 그러한 목록에 파일 크기, 권한 등도 포함되어 있다는 것을 알고 있습니다. - 나의 주요 관심사는 사용자별로 정렬하는 것입니다. 그러면 편리하지 않을까요?

지금까지 나는 [사용된 경우 ] 파일 소유자를 포함하는 [따라서 그룹별로 정렬] ls -l | sort -k 3세 번째 열을 기준으로 정렬하는 것을 발견했습니다.ls -lsort -k 4

하지만파일 소유자가 세 번째 줄에 없으면 어떻게 되나요? 다른 방법이 있나요?열 수에 관계없이 이를 달성합니다.?


고쳐 쓰다: 말하는 걸 깜빡했어요나는 BASH에서 일해요그리고 상황이 더 복잡해지지 않도록 지금부터 한동안 이를 고수하도록 노력하세요.

답변1

어느 열이 어느 것인지 알지 못한 채 단일 출력에서 ​​소유자 이름이 어느 열에 있는지 확인하는 ls -l것은 불가능합니다 . 각 열의 항목을 파일과 일치시킬 수 있지만 passwd그룹 열이나 파일 이름 열이 일치하지 않을 것이라는 보장은 없습니다. 둘 다 에서 찾은 이름만 포함할 수 있습니다 /etc/passwd.

을 사용하려면 ls프로그램을 두 번 실행하면 됩니다. 한 번은 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)

관련 정보