답변:
stat
에서 GNU로 coreutils는 이 작업을 수행 할 수 있습니다
stat -c '%U' /path/of/file/or/directory
불행히도의 여러 버전이 stat
있으며 구문에 일관성이 없습니다. 예를 들어, FreeBSD에서는
stat -f '%Su' /path/of/file/or/directory
휴대 성이 문제가되는 경우에, 당신은 개시 아마 더 좋을 것 같아 질의 제안 결합 ls
과 awk
. 하나 대신 두 개의 프로세스를 시작해야하지만 POSIX 표준 기능 만 사용하는 이점이 있습니다.
ls -ld /path/of/file/or/directory | awk '{print $3}'
stat
사이트 전체 표준이 /usr/local/bin
있을 수 있음). 다른 유니스에.
stat -c '%U' DIR
를 인쇄 하지만 인쇄 UNKNOWN
방법은 사용자의 시각에 따라 덜 유용하거나 더 적합합니다.
출력을 파싱하는 ls
것은 좋은 생각 은 아니지만 처음 몇 개의 필드를 얻는 것은 예외입니다. 실제로 모든 "전통적인"유니스에서 작동합니다 (사용자 이름에 공백을 허용하는 일부 Windows 구현과 같은 플랫폼에서는 작동하지 않습니다).
ls -ld /path/to/directory | awk 'NR==1 {print $3}'
다른 옵션은 stat
명령 을 사용하는 것이지만 stat
쉘에서 문제 는 구문이 다른 여러 명령이 있으므로 stat
쉘 스크립트에서 이식 할 수 없다는 것 입니다 (Linux 설치에서도).
주어진 사용자가 소유자인지 테스트하는 것은 다른 제안입니다.
if [ -n "$(find . -user "$username" -print -prune -o -prune)" ]; then
echo "The current directory is owned by $username."
fi
if [ -n "$(find . -user "$(id -u)" -print -prune -o -prune)" ]; then
echo "The current directory is owned by the current user."
fi
ls | awk
, 불행히도 접근 방식에 대한 주의 사항이 있습니다 . 필자는 최근에 언급 한 "대상 파일 / 디렉토리가 다른 이름의 심볼릭 링크"에 대한 해결책을 찾지 못했습니다.
find . -user "$username" -print -prune -o -prune
당신 은 할 수 있습니다find . -maxdepth 0 -user "$username"
awk 'NR==1 {print $3}'
대신 사용하는 이유가 awk '{print $3}'
있습니까? 왜 이것이 필요한지 잘 모르겠습니다 NR==1
.
ls
은 경로의 줄 바꿈으로 인해 줄이 두 부분으로 나뉘는 위치 에 대한 구현을 알고 있습니까? GNU ls
(새 버전), BusyBox ls
및 FreeBSD ls
에서 개행은 각각 $'\n'
, ?
및 로 반환됩니다 ?
.
GNU find를 사용 하여이 작업을 수행 할 수도 있습니다.
find $directoryname -maxdepth 0 -printf '%u\n'
이것은 GNU 시스템 외부에서 이식 가능하지 않지만 작동하지 않는 Linux 배포판을 발견 한 것에 놀랐습니다.
-printf
:-(.