Câu trả lời:
Đây là hai oneliners. Một ls
cuộc gọi cho mỗi thành phần đường dẫn:
$ (IFS=/; set -f -- $PWD; for arg; do path="${path%/}/$arg"; ls -dal "$path"; done)
Đầu ra:
# 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
Chỉ với một cuộc gọi đến ls
với tất cả các đường dẫn:
$ (IFS=/; set -f -- $PWD; for arg; do path="${path%/}/$arg"; paths+=("$path"); done; ls -dal "${paths[@]}")
Đầu ra:
# 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
Linux đi kèm với namei
lệnh chủ yếu hữu ích để hiển thị các liên kết tượng trưng trong các đường dẫn, nhưng cũng có thể hiển thị quyền sở hữu.
$ namei -nom ~
f: /home/gilles
drwxr-xr-x root root /
drwxr-sr-x root staff home
drwxr-xr-x gilles gilles gilles
Mặt khác, đây là một cách để lặp lại các thư mục liên tiếp chứa một tệp đã cho (không phải là duy nhất, như các câu trả lời khác trên trang này minh họa) và liệt kê nội dung của chúng.
d=$PWD; set /;
while [ -n "$d" ]; do set -- "$@" "$d/"; d=${d%/*}; done;
ls -ld "$@"
Lưu ý rằng danh sách này có thể là một chút sai lệch trong sự hiện diện của các liên kết tượng trưng. Ví dụ, nếu /foo/bar
là một liên kết tượng trưng đến /hello/world
mà là chính nó một liên kết tượng trưng đến /one/two
, và tất cả /foo
, /hello
và /world
là (nói chế độ 755) thế giới có thể đọc được nhưng /hello
không thể đọc được để sử dụng Alice, sau đó Alice sẽ không thể đạt được /foo/bar
, nhưng danh sách trên sẽ chỉ hiển thị các thư mục có thể đọc được trên thế giới.
#!/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
Tôi không biết một cách ngắn để làm như vậy. Đối với tác vụ này, tôi sử dụng tập lệnh shell, bạn cũng có thể thấy hữu ích:
#!/bin/ksh
if [ $# -eq 0 ]
then
set "$PWD"
fi
for path in "$@"
do
while true
do
ls -ld "$path"
if [ -z "$path" -o "$path" = . -o "$path" = / ]
then
break
fi
path=$(dirname "$path")
done
done
EDIT : Sử dụng một until
vòng lặp bỏ qua nhu cầu nghỉ ...
#!/bin/ksh
[ $# -eq 0 ] && set "$PWD"
for path
do
until test -z "$path" -o "$path" = . -o "$path" = /
do
ls -ld "$path"
path=$(dirname "$path")
done
done
set --
mà không có-f
? Tôi đã thử với một thư mụca[bar]
trên cấp độ tương tự như thư mụcab
,aa
vàar
, nhưng đã không thành công. (EDIT: Thành công trong thất bại, đó là. Tôi muốn biết làm thế nào nó đi sai.)