`ls -l` de un file y todos los directorys que lo conducen?

Antes de comenzar a escribir un guión (probablemente fácil), ¿hay algún command que haga el equivalente al siguiente?

[:~/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 

sin tener que escribir manualmente todas las routes parciales? La idea sería poder decir

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

o

 command -l /usr/bin/tee 

y tener el resultado anterior — que muestra la list detallada de todas las routes parciales que conducen a la final. Un truco de expansión de shell que puede generar / /usr /usr/bin /usr/bin/tee dado /usr/bin/tee lo hará.

Related of "`ls -l` de un file y todos los directorys que lo conducen?"

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

sed parte:

  • :0 label 0 ;
  • p printing;
  • s!p!r! reemplace el patrón p con el reemploop r ;
  • /[^/]*$ busca / , luego cualquier secuencia de no- / hasta el final de la línea;
  • el reemploop está vacío, así que simplemente elimine la coincidencia;
  • t0 si s!!! realiza un reemploop, luego vaya a la label 0 .

Editar por OP después de los comentarios

Hice lo siguiente (gracias a los comentarios, especialmente por Jander y Andrey): agregando

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

a mi .zshrc y luego puedo usar

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

y teniendo la salida deseada.

¿Qué hay de usar expansiones de corsé?

 $ 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 

No puedo pensar en ningún truco de expansión o utilidad para hacerlo todo de una vez. Entonces, un bucle es el path a seguir. Aquí hay un código que funciona tanto bajo bash como con zsh, y acomoda directorys con nombres arbitrarios.

 ## Usage: set_directory_chain VAR FILENAME ## Set VAR to the chain of directories leading to FILENAME ## eg 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 ## eg 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 } 

Tenga en count que si esto trata la cadena de directorys como una cadena. Si hay componentes o enlaces simbólicos, puede que esto no sea lo que necesita. Por ejemplo, si desea verificar los permissions en los directorys, primero debe resolver el directory en una ruta absoluta. En zsh, puede usar /path/to/foo(:A) . En Linux, puede usar readlink -f /path/to/foo .

Linux (y sin soporte acl):

 namei -l /foo/bar/baz 

En 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 )