ファイルパスがあります。パス内のすべての中間ディレクトリのファイル/ディレクトリ権限を表示する単一のコマンドはありますか?
答え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 {} \;