Bash 스크립트에서 파일 소유자를 반환하는 방법을 찾고 있습니다. "gawk"를 사용하면 가능할 것 같지만 솔직히 실마리도 없고 온라인에 게시된 이해 가능한 답변도 없는 것 같습니다.
답변1
이를 위해 사용됩니다 stat
.
GNU 시스템에서:
소유자의 사용자 이름을 얻으려면:
stat -c '%U' file.txt
소유자의 사용자 ID(UID)를 얻으려면:
stat -c '%u' file.txt
파일이 file.txt
.
FreeBSD 및 Mac OS X에서 사용 가능(@cas님 감사합니다):
사용자 이름:
stat -f '%Su' file.txt
UID의 경우:
stat -f '%u' file.txt
답변2
ls -l foo
필드 #3은 소유자이고 필드 #4는 그룹입니다. 그러므로:
set -- $(ls -l foo) ; echo $3
하지만통계자료가능하다면 더 좋을 것 같습니다.
답변3
zsh
쉘에는 모듈에 자체 내장 명령이 있다는 점에 유의하십시오 stat
(그리고 GNU 및 BSD가 자체 명령을 추가하기 오래 전에 해당 명령이 있었습니다) zsh/stat
.
zmodload zsh/stat
stat +uid file
심볼릭 링크의 확인된 소유자 uid를 출력합니다 file
. 심볼릭 링크의 경우 궁극적으로 파일 대신 심볼릭 링크의 소유자를 확인하려면 이 -L
옵션을 추가하세요( stat
a lstat()
대신 a stat()
).
-s
사용자 이름으로 번역하는 옵션을 추가합니다 uid
. 해당 uid에 사용자 이름이 여러 개 있으면 보고됩니다 getpwuid()
. uid에 사용자 이름이 없으면 uid는 번역되지 않은 상태로 유지됩니다.
GNU coreutils stat
명령이 추가되기 오래 전에 GNU는 조건자를 통해 이 작업을 수행 find
할 수 있었습니다 .-printf
find file -prune -printf '%U\n'
uid를 일치하는 사용자 이름으로 변환하여 %U
대체 되었습니다 . 기호 링크를 따라 최종 대상의 소유자를 얻는 옵션이 %u
추가되었습니다 .-H
POSIXly에서는 다음에 의존해야 합니다 ls
.
LC_ALL=C ls -nd file | LC_ALL=C awk '{print $3; exit}'
-n
uid를 사용자 이름 으로 변환하는 것으로 대체합니다 -l
(사용자 이름에 공백이나 탭이 포함되어 있지 않다고 가정). -L
심볼릭 링크를 따라가는 옵션을 추가합니다 .