パス内のすべての中間ディレクトリの権限を表示する方法はありますか? [コピー]

パス内のすべての中間ディレクトリの権限を表示する方法はありますか? [コピー]

ファイルパスがあります。パス内のすべての中間ディレクトリのファイル/ディレクトリ権限を表示する単一のコマンドはありますか?

答え1

Linuxに付属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であり、/foo/bar誰もが読み取ることができます(モード755など)。表示します。/hello/world/one/two/foo/hello/world/hello/foo/bar

答え2

これは2つのシングルライナーです。lsパスコンポーネントごとに1回呼び出されます。

$ (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 {} \;

関連情報