Gibt es eine Möglichkeit, die Berechtigungen aller Zwischenverzeichnisse eines Pfads anzuzeigen?

8

Ich habe einen Dateipfad. Gibt es einen einzelnen Befehl, um die Datei- / Verzeichnisberechtigungen aller Zwischenverzeichnisse im Pfad anzuzeigen?

xyz
quelle

Antworten:

8

Hier sind zwei Oneliner. Ein lsAufruf pro Pfadkomponente:

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

Ausgabe:

# 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

Mit nur einem Aufruf an lsalle Pfade:

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

Ausgabe:

# 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
janmoesen
quelle
Danke für die Korrektur, Gilles! Können Sie ein Beispiel dafür , wie Globbing kann vermasseln das geben , set --ohne -f? Ich habe es mit einem Verzeichnis a[bar]auf der gleichen Ebene wie Verzeichnisse abversucht, aaund es arist mir nicht gelungen. (EDIT: Erfolgreich scheitern, das heißt. Ich möchte wissen, wie es schief geht.)
Janmoesen
9

Linux wird mit dem nameiBefehl geliefert, der hauptsächlich zum Anzeigen symbolischer Links in Pfaden nützlich ist, aber auch den Besitz anzeigen kann.

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

Andernfalls können Sie die nachfolgenden Verzeichnisse mit einer bestimmten Datei (nicht die einzige, wie andere Antworten auf dieser Seite zeigen) durchlaufen und deren Inhalt auflisten.

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

Beachten Sie, dass diese Auflistung bei Vorhandensein symbolischer Links etwas irreführend sein kann. Zum Beispiel, wenn /foo/barein symbolischer Link zu /hello/worlddenen sich ein symbolischer Link auf /one/two, und alle /foo, /hellound /worldsind die Welt lesbar (etwa 755) , sondern /helloist auf Benutzer Alice nicht lesbar, dann Alice nicht in der Lage zu erreichen /foo/bar, noch In der obigen Auflistung werden nur weltweit lesbare Verzeichnisse angezeigt.

Gilles 'SO - hör auf böse zu sein'
quelle
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
Chris Down
quelle
0

Ich kenne keinen kurzen Weg, dies zu tun. Für diese Aufgabe verwende ich ein Shell-Skript, das Sie möglicherweise auch nützlich finden:

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

BEARBEITEN : Die Verwendung einer untilSchleife macht die Pause überflüssig ...

 #!/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
ktf
quelle
Ihr Skript wird auf bestimmten Pfaden mit Sonderzeichen unterbrochen.
Chris Down
ok - einige weitere Zitate hinzugefügt. Aber für solch seltene Gelegenheiten und ohne Änderungen an irgendetwas habe ich damit gelebt.
Ktf
1
Es wäre einfacher, das IFSAufteilen zu nutzen /, wie es Janmoesen tut .
Gilles 'SO - hör auf böse zu sein'
0

Nicht so kompliziert, aber das würde dir wohl helfen.

find . -type d -exec ls -lrt {} \;
Diham
quelle