사용자별로 ls 출력 정렬

사용자별로 ls 출력 정렬

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

사용자_   파일1
사용자_   파일2
사용자_   another_file
사용자_   this_file
사용자_   that_파일
사용자_   파일3

나는 이와 같은 목록에 파일 크기, 권한 등도 포함된다는 것을 알고 있습니다. 나의 주요 관심사는 사용자별 정렬입니다. 꽤 편리하겠지, 그렇지?

지금까지 나는 ls -l | sort -k 3[사용하는 경우 ls -l] 파일 소유자를 포함하는 [따라서 sort -k 4그룹별로 정렬] 열 3을 기준으로 정렬하는 방법을 찾았습니다.

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


업데이트: 그 말을 깜빡했네요나는 BASH에서 일한다그리고 상황이 더 복잡해지지 않도록 지금부터 꽤 오랫동안 그 일을 고수하도록 노력하세요.

답변1

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

을(를) 사용하려면 ls프로그램을 두 번(as로 한 번, as ls -l로 한 번) 실행할 수 있습니다 ls -g. 후자는 소유자를 삭제하므로 다른 정보를 기반으로 행을 일치시켜 지정하지 않고도 소유자 이름을 확인할 수 있습니다. 그러나 이것은 bash 쉘 스크립트에서 수행하고 싶은 연습이 아닙니다.

답변2

를 사용하면 zsh정렬 순서를 정의하고 다음과 같은 globbing 한정자에 사용할 수 있습니다.

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=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)

관련 정보