경로에 있는 모든 중간 디렉터리의 권한을 볼 수 있는 방법이 있습니까? [복사]

경로에 있는 모든 중간 디렉터리의 권한을 볼 수 있는 방법이 있습니까? [복사]

파일 경로가 있습니다. 경로에 있는 모든 중간 디렉터리의 파일/디렉터리 권한을 볼 수 있는 단일 명령이 있습니까?

답변1

리눅스와 함께 제공되는namei이 명령은 주로 경로의 기호 링크를 표시하는 데 사용되지만 소유권도 표시할 수 있습니다.

$ namei -nom ~   
f: /home/gilles
 drwxr-xr-x root   root   /
 drwxr-sr-x root   staff  home
 drwxr-xr-x gilles gilles gilles

그렇지 않으면 이것은 주어진 파일을 포함하는 연속 디렉토리 (이 페이지의 다른 답변에서 제안하는 것처럼 고유 디렉토리가 아님)를 반복하고 해당 내용을 나열하는 방법입니다.

d=$PWD; set /;
while [ -n "$d" ]; do set -- "$@" "$d/"; d=${d%/*}; done;
ls -ld "$@"

심볼릭 링크가 있으면 이 목록이 약간 오해를 불러일으킬 수 있습니다. 예를 들어, 그 자체가 심볼릭 링크 및 all 이고 누구나 읽을 수 있지만(예: 모드 755) 사용자 Alice가 읽을 수 없는 /foo/bar심볼릭 링크인 경우 Alice는 해당 링크에 액세스할 수 없지만 위 목록은 누구나 읽을 수 있는 디렉토리를 표시합니다./hello/world/one/two/foo/hello/world/hello/foo/bar

답변2

이것은 두 개의 단일 라이너입니다. ls경로 구성요소당 한 번씩 호출됩니다.

$ (IFS=/; set -f -- $PWD; for arg; do path="${path%/}/$arg"; ls -dal "$path"; done)

산출:

# drwxr-xr-x  31 root  admin  1122  4 Nov 22:08 /
# drwxr-xr-x  9 root  admin  306  3 Nov 17:36 /Users
# drwxr-xr-x+ 67 janmoesen  staff  2278  7 Nov 14:46 /Users/janmoesen
# drwxr-xr-x+ 53 janmoesen  staff  1802  4 Nov 22:07 /Users/janmoesen/Sites
# drwxr-xr-x  28 janmoesen  staff  952  7 Nov 15:01 /Users/janmoesen/Sites/example.com

ls모든 경로에 대해 한 번만 호출하면 됩니다.

$ (IFS=/; set -f -- $PWD; for arg; do path="${path%/}/$arg"; paths+=("$path"); done; ls -dal "${paths[@]}")

산출:

# drwxr-xr-x  31 root       admin  1122  4 Nov 22:08 /
# drwxr-xr-x   9 root       admin   306  3 Nov 17:36 /Users
# drwxr-xr-x+ 67 janmoesen  staff  2278  7 Nov 14:46 /Users/janmoesen
# drwxr-xr-x+ 53 janmoesen  staff  1802  4 Nov 22:07 /Users/janmoesen/Sites
# drwxr-xr-x  28 janmoesen  staff   952  7 Nov 15:01 /Users/janmoesen/Sites/example.com

답변3

#!/bin/bash

(( $# )) || set -- "$PWD"

IFS='/'
for _arg; do
    if ! [[ -e "${_arg}" ]]; then
        printf '%s\n' "${_arg} does not exist!"
        exit 1
    fi

    read -ra _dirs <<< "${_arg}"
    (( _length = ${#_dirs[@]} + 1 ))
    for (( _offset = 2 ; _offset < _length ; _offset++ )); do
        _current_dir="${_dirs[*]::_offset}"
        _perms=$(ls -ld "${_current_dir}" | awk '{ print $1" "$3" "$4 }')
        printf '%s %s\n' "${_perms}" "${_current_dir}"
    done
done

답변4

그렇게 복잡하지는 않지만 이것이 도움이 될 것이라고 생각합니다.

find . -type d -exec ls -lrt {} \;

관련 정보