디렉토리 또는 파일의 소유자를 찾으십시오.


62

디렉토리의 소유자를 반환 할 명령을 찾고 있는데 명령과 같은 것을 구문 분석하는 정규 표현식과 같은 ls -lat것입니까? 다른 스크립트에서 결과를 사용하고 싶습니다.

답변:


102

stat 에서 GNU로 coreutils는 이 작업을 수행 할 수 있습니다

stat -c '%U' /path/of/file/or/directory

불행히도의 여러 버전이 stat있으며 구문에 일관성이 없습니다. 예를 들어, FreeBSD에서는

stat -f '%Su' /path/of/file/or/directory

휴대 성이 문제가되는 경우에, 당신은 개시 아마 더 좋을 것 같아 질의 제안 결합 lsawk. 하나 대신 두 개의 프로세스를 시작해야하지만 POSIX 표준 기능 만 사용하는 이점이 있습니다.

ls -ld /path/of/file/or/directory | awk '{print $3}'

2
간결성이 보너스 인 경우 stat -c % U / path.
tsvallender

1
그것은 이전 Linux 시스템에서는 그렇지 않은 GNU 통계를 가정합니다 (심지어 새로운 시스템 에서도, 사용자의 집 안 또는 다른 곳에서 stat사이트 전체 표준이 /usr/local/bin있을 수 있음). 다른 유니스에.
Gilles

1
stat -c %U명령이 컴파일 된 경우 BusyBox 작업도 가능하다는 장점이 있습니다 stat.
Gilles

1
마지막 예제 (ls)는 유닉스 / OSX와 리눅스 모두에서 작동합니다.
kenorb

1
ls는 소유자와 일치하는 로컬 사용자가없는 경우 (예 : 네트워크 공유에있는 경우) uid stat -c '%U' DIR를 인쇄 하지만 인쇄 UNKNOWN방법은 사용자의 시각에 따라 덜 유용하거나 더 적합합니다.
basic6

18

출력을 파싱하는 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 , 불행히도 접근 방식에 대한 주의 사항이 있습니다 . 필자는 최근에 언급 한 "대상 파일 / 디렉토리가 다른 이름의 심볼릭 링크"에 대한 해결책을 찾지 못했습니다.
beporter

대신 find . -user "$username" -print -prune -o -prune당신 은 할 수 있습니다find . -maxdepth 0 -user "$username"
Niklas Holm

@Gilles 당신이 awk 'NR==1 {print $3}'대신 사용하는 이유가 awk '{print $3}'있습니까? 왜 이것이 필요한지 잘 모르겠습니다 NR==1.
Harold Fischer

1
@HaroldFischer 경로에 줄 바꿈이 포함 된 경우에만 해당됩니다. 거의 필요하지 않지만 결코 해롭지 않습니다.
Gilles

@Gilles 알아두면 매우 좋습니다 !! 궁금한 점 ls은 경로의 줄 바꿈으로 인해 줄이 두 부분으로 나뉘는 위치 에 대한 구현을 알고 있습니까? GNU ls(새 버전), BusyBox ls및 FreeBSD ls에서 개행은 각각 $'\n', ?및 로 반환됩니다 ?.
Harold Fischer

9

GNU find를 사용 하여이 작업을 수행 할 수도 있습니다.

find $directoryname -maxdepth 0 -printf '%u\n'

이것은 GNU 시스템 외부에서 이식 가능하지 않지만 작동하지 않는 Linux 배포판을 발견 한 것에 놀랐습니다.


1
이것은 내장되지 않은 모든 Linux 시스템과 다른 시스템 (예 : Cygwin)에서 작동합니다. 임베디드 시스템은이 가능성이 비지 박스 누구, find이하지 않습니다 -printf.
Gilles

내가 말했듯이 GNU 시스템.
mattdm

GNU coreutils가없는 시스템 (예 : FreeBSD)에는 -printf:-(.
pevik

@ pevik 그래, 내가 말했듯이 여전히. 그러나 필요한 경우 GNU find를 설치할 수 있습니다. :)
mattdm

@mattdm : 항상 그런 것은 아니다 :-(. 가장 중요한 것은 이식성이 좋은 스크립트를 작성할 때이다.
pevik

2

순수 bash에서는 출력을 ls배열 로 변환 하고 색인을 생성 할 수 있습니다.

# (lrwxr-xr-x, 1, myuser, staff, 36, Oct, 21, 16:36, /path/to/file)    
file_meta=($(ls -ld /path/to/file))
file_owner="${file_meta[2]}" # myuser

그것은 사용하는 것만 큼 우아한 아니다 stat, find또는 awk,하지만 핀치에서 일할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.