'ls -l' de um arquivo e todos os diretórios que levam a ele?

5

Antes de começar a escrever um script (provavelmente fácil), existe um comando que faz o equivalente ao seguinte:

[:~/software/scripts] % ls -ld / /usr /usr/bin /usr/bin/tee 
drwxr-xr-x 21 root root  4096 Mar 31 08:48 /
drwxr-xr-x 11 root root  4096 Jan 30 09:48 /usr
drwxr-xr-x  2 root root 73728 Apr 14 07:54 /usr/bin
-rwxr-xr-x  1 root root 26308 Jan 16  2013 /usr/bin/tee

sem ter que digitar manualmente todos os caminhos parciais? A ideia seria poder dizer

ls --this-new-flag /usr/bin/tee  

ou

command -l /usr/bin/tee 

e com a saída acima --- mostrando a listagem detalhada de todos os caminhos parciais que levam ao final. Um truque de expansão de shell que pode gerar / /usr /usr/bin /usr/bin/tee dado /usr/bin/tee também serve.

    
por Rmano 14.04.2014 / 17:12

5 respostas

4
ls -ld 'echo 'path/to/file' | sed ':0 p;s!/[^/]*$!!;t0' | sort -u'

sed part:

  • :0 label 0 ;
  • p print;
  • s!p!r! substitui o padrão p pela substituição r ;
  • /[^/]*$ procura por / , depois qualquer sequência de não- / até o final da linha;
  • a substituição está vazia, basta excluir a correspondência;
  • t0 if s!!! realiza uma substituição e, em seguida, vai para o rótulo 0 .

Editar por OP após comentários

Eu fiz o seguinte (graças aos comentários, especialmente por Jander e Andrey): adicionando

explode() {echo "$1" | sed -n ':0 p;s![^/]\+/*$!!;t0' | sort -u}

para o meu .zshrc e, em seguida, posso usar

ls -ld $(explode /path/to/file) 

e tendo a saída desejada.

    
por 14.04.2014 / 18:16
4

Que tal usar expansões de chaves?

$ ls -ld /{,usr/{,bin/{,tee}}}
drwxr-xr-x 23 root root  4096 Mar  7 06:57 /
drwxr-xr-x 10 root root  4096 Jan  9  2013 /usr/
drwxr-xr-x  2 root root 40960 Apr  9 23:57 /usr/bin/
-rwxr-xr-x  1 root root 26176 Nov 19  2012 /usr/bin/tee
    
por 15.04.2014 / 02:14
2

Não consigo pensar em nenhum truque ou utilitário de expansão para fazer tudo de uma vez. Então, um loop é o caminho a percorrer. Aqui está um código que funciona tanto no bash quanto no zsh e acomoda diretórios com nomes arbitrários.

## Usage: set_directory_chain VAR FILENAME
## Set VAR to the chain of directories leading to FILENAME
## e.g. set_directory_chain a /usr/bin/env is equivalent to
## a=(/ /usr /usr/bin /usr/bin/env)
set_directory_chain () {
  local __set_directory_chain_a __set_directory_chain_path
  __set_directory_chain_a=()
  __set_directory_chain_path=$2
  while [[ __set_directory_chain_path = *//* ]]; do
    __set_directory_chain_path=${__set_directory_chain_path//\/\///}
  done
  if [[ $__set_directory_chain_path != /* ]]; then
    __set_directory_chain_path=$PWD/$__set_directory_chain_path
  fi
  while [[ -n $__set_directory_chain_path ]]; do
    __set_directory_chain_a=("$__set_directory_chain_path" "${__set_directory_chain_a[@]}")
    __set_directory_chain_path=${__set_directory_chain_path%/*}
  done
  eval "$1=(/ \"\${__set_directory_chain_a[@]}\")"
}

## Apply a command to all the directories in a chain
## e.g. apply_on_directory_chain /usr/bin/env ls -ld is equivalent to
## ls -ld / /usr /usr/bin /usr/bin/env
apply_on_directory_chain () {
  local __apply_on_directory_chain_a
   set_directory_chain __apply_on_directory_chain_a "$1"
   shift
   "$@" "${__apply_on_directory_chain_a[@]}"
}

lschain () {
  for x; do apply_on_directory_chain "$x" ls -ld; done
}

Observe que, se isso tratar a cadeia de diretórios como uma string. Se houver .. componentes ou links simbólicos, isso pode não ser o que você precisa. Por exemplo, se você quiser verificar as permissões nos diretórios, precisará resolver o diretório para um caminho absoluto primeiro. Em zsh, você pode usar /path/to/foo(:A) . No Linux, você pode usar readlink -f /path/to/foo .

    
por 15.04.2014 / 03:36
2

Linux (e sem suporte a acl):

namei -l /foo/bar/baz
    
por 15.04.2014 / 06:25
1

Em zsh :

als() {
  until [[ $1 = [/.] ]] {argv[1,0]=$1:h;}; ls -ld -- "$@"
}

POSIXly:

als() (
  while :; do
    case $1 in
      [./]) exec ls -ld -- "$@"
    esac
    set -- "$(dirname -- "$1")" "$@"
  done
)
    
por 17.04.2014 / 08:37

Tags