Có cách nào để xem các quyền của tất cả các thư mục trung gian của một đường dẫn ..?


8

Tôi có một đường dẫn tệp .. Có bất kỳ lệnh nào để xem các quyền của tệp / thư mục của tất cả các thư mục trung gian trong đường dẫn ..?

Câu trả lời:


8

Đây là hai oneliners. Một lscuộ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 lsvớ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

Cảm ơn đã sửa chữa, Gilles! Bạn có thể đưa ra một ví dụ về làm thế nào Globing có thể gây rối set --mà không có -f? Tôi đã thử với một thư mục a[bar]trên cấp độ tương tự như thư mục ab, aaar, 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.)
janmoesen

9

Linux đi kèm với nameilệ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/barlà một liên kết tượng trưng đến /hello/worldmà là chính nó một liên kết tượng trưng đến /one/two, và tất cả /foo, /hello/worldlà (nói chế độ 755) thế giới có thể đọc được nhưng /hellokhô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.


1
#!/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

0

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 untilvò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

Kịch bản của bạn sẽ phá vỡ trên các đường dẫn nhất định với các ký tự đặc biệt.
Chris Xuống

ok - thêm một số trích dẫn. Nhưng trong những dịp hiếm hoi như vậy và không có thay đổi nào đối với bất cứ điều gì tôi đã sống với điều đó.
ktf

1
Nó sẽ đơn giản hơn để tận dụng IFSđể chia tách /, giống như janmoesen .
Gilles 'SO- ngừng trở nên xấu xa'

0

Không quá phức tạp, nhưng điều này sẽ giúp bạn đoán.

find . -type d -exec ls -lrt {} \;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.