Esta pregunta ya ha sido respondida en superuser.com (no sé si puedo marcar una pregunta de un sitio como duplicada de otro). La solución es tan simple como escribir (asumiendo que estoy en el mismo directorio que el nombre del archivo de destino):
$ namei -l $(pwd)/somefile ## or `namei -l $(realpath -s somefile)`
Debido a -l
, enumera los permisos básicos en formato largo para cada directorio principal.
Tengo que usar pwd
/realpath
porque namei
no resuelve las rutas relativas. Si no estoy en el directorio de destino, simplemente escriba la ruta completa.
Hice este pequeño script que hace esto. yo uso cd "$1"; pwd
para obtener el directorio actual para que las rutas no se canonicalicen (por ejemplo, si intenta magic-ls .
y su directorio actual es /var/lib/postgres, pero ese es un enlace simbólico a /mnt/postgres, obtendrá /var
, /var/lib
y /var/lib/postgres
, mientras usa realpath
obtendrías /mnt
y /mnt/postgres
)
magic-ls() {
local current=$(cd "$1"; pwd)
while [[ $current != '/' ]]; do
ls -ld "$current"
current=$(dirname "$current")
done
}
Aquí hay una salida de ejemplo:
[[email protected] ~]$ magic-ls
drwx------ 1 leodag leodag 2722 jun 21 13:49 /home/leodag
drwxr-xr-x 1 root root 18 mai 2 2019 /home
Por cierto, también funcionará sin argumentos desde cd ""
no cambia su directorio.
Editar:eliminado realpath
de la comprobación while, ya que eso podría generar resultados inesperados si hubiera un enlace a /
en el camino, y no era necesario.
Simplemente usando la expansión de parámetros:
#!/usr/bin/env bash
path="$1"
while test -n "$path"; do
ls -lLd "$path"
path="${path%/*}"
done
método de llamada:
bash test.sh /var/lib/program/subfolder/somefile
dando
-rw-r--r-- 1 root root 0 Jun 21 18:49 /var/lib/program/subfolder/somefile
drwxr-xr-x 1 root root 4096 Jun 21 18:49 /var/lib/program/subfolder
drwxr-xr-x 1 root root 4096 Jun 21 18:49 /var/lib/program
drwxr-xr-x 1 root root 4096 Jun 21 18:49 /var/lib
drwxr-xr-x 1 root root 4096 Jun 13 19:24 /var
Escribí un script bash para ti. Tendrá algunos errores, si tiene espacio en los nombres. Si te molesta, estoy feliz por las recomendaciones de cambios en los comentarios.
#!/bin/bash
if [ ! -z "$1" ] && [ -e "$1" ]
then
path=`realpath -s "$1"` # read argument as absolute path
else
path="$PWD" # No valid argument, so we take pwd
fi
paths=""
while [ "$path" != / ];do
paths+=" $path"
path=`dirname "$path"`
done
paths+=" $path" # Adding / to pathlist too
ls -ld $paths
Con realpath -s
puede tomar la ruta absoluta, pero no seguirá el enlace. Si no se da ningún argumento, usaremos pwd como archivo/directorio para listar.
Agregamos cada ruta a una lista. Esto nos da la ventaja de un mejor diseño al final, de modo que obtenemos una buena tabla porque ejecutamos ls
solo una vez.
Salida:
bobafit:~$ magic_ls_-l_command /usr/bin/python3
drwxr-xr-x 21 root root 4096 Jun 20 10:07 /
drwxr-xr-x 14 root root 4096 Sep 5 2019 /usr
drwxr-xr-x 2 root root 110592 Jun 20 10:07 /usr/bin
lrwxrwxrwx 1 root root 9 Apr 7 12:43 /usr/bin/python3 -> python3.8