Existe uma maneira de ver as permissões de todos os diretórios intermediários de um caminho ..?

7

Eu tenho um caminho de arquivo .. Existe algum comando único para ver as permissões de arquivo / diretório de todos os diretórios intermediários no caminho ..?

    
por xyz 07.11.2011 / 11:40

5 respostas

8

Aqui estão dois oneliners. Uma ls chamada por componente de caminho:

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

Saída:

# 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

Com apenas uma chamada para ls com todos os caminhos:

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

Saída:

# 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
    
por 07.11.2011 / 15:09
6

O Linux vem com o comando namei que é principalmente útil para exibir links simbólicos em caminhos, mas pode também mostra a propriedade.

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

Caso contrário, aqui está uma maneira de fazer uma iteração nos diretórios sucessivos que contêm um determinado arquivo (não o único, como outras respostas nesta página ilustram) e listar seu conteúdo.

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

Observe que essa listagem pode ser um pouco enganosa na presença de links simbólicos. Por exemplo, se /foo/bar for um link simbólico para /hello/world , que é um link simbólico para /one/two , e todos os /foo , /hello e /world são legíveis por todo o mundo (digamos 755), mas /hello não é legível para o usuário Alice, então Alice não poderá alcançar /foo/bar , mas a listagem acima mostrará apenas diretórios legíveis pelo mundo.

    
por 08.11.2011 / 00:38
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
    
por 07.11.2011 / 14:34
0

Eu não sei de um jeito curto de fazer isso. Para esta tarefa eu uso um script de shell, você pode achar útil também:

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

EDITAR : Usar um loop until omite a necessidade da quebra ...

 #!/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
    
por 07.11.2011 / 12:29
0
Não é tão complicado, mas isso ajudaria você, eu acho.

find . -type d -exec ls -lrt {} \;
    
por 26.12.2011 / 17:58