리눅스에서는 방법이 있나요?ls
사용자별로 출력 정렬? 내가 달성하려는 것은 다음과 같습니다.
사용자_ㅏ 파일 1
사용자_ㅏ 파일 2
사용자_두번째
another_fileuser_ 씨
this_file_user_ 씨 that_파일
사용자_디 파일 3
나는 그러한 목록에 파일 크기, 권한 등도 포함되어 있다는 것을 알고 있습니다. - 나의 주요 관심사는 사용자별로 정렬하는 것입니다. 그러면 편리하지 않을까요?
지금까지 나는 [사용된 경우 ] 파일 소유자를 포함하는 [따라서 그룹별로 정렬] ls -l | sort -k 3
세 번째 열을 기준으로 정렬하는 것을 발견했습니다.ls -l
sort -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
답변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)