Quiero obtener una lista de todos los permisos de directorio de la carpeta actual a / . Por ejemplo, para el directorio: /var/lib/program/subfolder , quiero una salida como:
$ pwd /var/lib/program/subfolder $ magic_ls_-l_command somefile drwxr-xr-x 10 root root 4096 May 15 20:20 var drwxr-xr-x 10 root root 4096 May 15 20:20 lib drwxrwxr-x 10 root user 4096 May 16 20:21 program drwxrwxr-x 10 root user 4096 May 16 20:21 subfolder -rwxrwxr-- 1 root user 4096 May 16 20:22 somefile No me importa el orden (de /var a /subfolder o al revés), la cantidad de enlaces duros o incluso la fecha. Simplemente los escribí para emular la salida ls -l . Además, no me importa cómo se imprima cada nombre de archivo ( /var y /lib , var y lib , o /var y /var/lib ). Solo estoy interesado en la propiedad de cada archivo/directorio en la ruta desde el archivo elegido o pwd a / .
En caso de que deba instalar algún programa, estoy bajo Ubuntu 20.04.
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 capturar 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.
Producción:
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.8Esto posiblemente debería funcionar:
pwd ; ls -lh ; while true ; do cd .. ; pwd ; ls -lh ; [[ "$PWD" == "/" ]] && break ; doneEDITAR: Entendí mal la pregunta al principio. Prueba esto:
(pwd ; ls -ldh ; while true ; do cd .. ; pwd ; ls -ldh ; [[ "$PWD" == "/" ]] && break ; done ; cd "$START")EDIT2: la respuesta de fillipe es probablemente la mejor, pero aquí está mi tercer y último intento, que funciona tanto en archivos como en directorios:
magic_ls() { fname="$1" while true ; do ls -lhd "$fname" [[ "$fname" == "/" ]] && break ; fname=$(dirname $(readlink -f "$fname")) done }Hice este pequeño script que hace esto. Yo uso cd "$1"; pwd para obtener el directorio actual para que las rutas no se canonicen (por ejemplo, si prueba 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 , al usar 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:
[leodag@desk ~]$ 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 ya que cd "" no cambia su directorio.
Editar: eliminó la realpath de la verificación while, ya que eso podría generar resultados inesperados si hubiera un enlace a / en la ruta, y no era necesario.
#! /bin/bash cur="" IFS="/" path=`pwd` for dir in ${path:1} do cur=$cur/$dir ls -lhd "$cur" done cur=$cur/$1 ls -lhd "$cur"Sesión terminal:
$ pwd /tmp/dir_underscore/dir space/dir special @!) $ ls bash.sh test.txt $ ./bash.sh test.txt drwxrwxrwt 28 root root 36K Jun 21 22:45 /tmp drwxr-xr-x 3 root root 4.0K Jun 21 22:27 /tmp/dir_underscore drwxr-xr-x 3 root root 4.0K Jun 21 22:28 '/tmp/dir_underscore/dir space' drwxr-xr-x 2 root root 4.0K Jun 21 22:54 '/tmp/dir_underscore/dir space/dir special @!)' -rw-r--r-- 1 root root 0 Jun 21 22:29 '/tmp/dir_underscore/dir space/dir special @!)/test.txt'Solo usando la expansión de parámetros:
#!/usr/bin/env bash path="$1" while test -n "$path"; do ls -lLd "$path" path="${path%/*}" donemétodo de llamada:
bash test.sh /var/lib/program/subfolder/somefiledonación
-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 /varEsta 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):
$ nombrei -l $(pwd)/algunarchivo ## o `nombrei -l $(rutareal -s algunarchivo)`
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.
Sólo mis 2 centavos. Mi mac no tiene el comando namei (quizás homebrew tenga una copia), pero quería crear una versión rápida que alineara la salida en orden de arriba hacia abajo
#!/usr/bin/env bash path="${1%/}" DIRS=() while test -n "$path"; do DIRS=( "$path" "${DIRS[@]}" ) path="${path%/*}" done ls -ld "${DIRS[@]}"Salida de ejemplo:
$ lspath $TMPDIR lrwxr-xr-x@ 1 root wheel 11 Oct 5 2018 /var -> private/var drwxr-xr-x 7 root wheel 224 Jul 16 2020 /var/folders drwxr-xr-x@ 3 root wheel 96 Apr 5 2018 /var/folders/0c drwxr-xr-x@ 5 me staff 160 Apr 5 2018 /var/folders/0c/2_s_qxd11m3d1smzqdrs3qg40000gp drwx------@ 255 me staff 8160 Oct 7 09:18 /var/folders/0c/2_s_qxd11m3d1smzqdrs3qg40000gp/T