Antworten:
Hier sind zwei Oneliner. Ein ls
Aufruf 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 ls
alle 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
Linux wird mit dem namei
Befehl 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/bar
ein symbolischer Link zu /hello/world
denen sich ein symbolischer Link auf /one/two
, und alle /foo
, /hello
und /world
sind die Welt lesbar (etwa 755) , sondern /hello
ist 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.
#!/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
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 until
Schleife 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
set --
ohne-f
? Ich habe es mit einem Verzeichnisa[bar]
auf der gleichen Ebene wie Verzeichnisseab
versucht,aa
und esar
ist mir nicht gelungen. (EDIT: Erfolgreich scheitern, das heißt. Ich möchte wissen, wie es schief geht.)