Tato otázka již byla zodpovězena na superuser.com (nevím, zda mohu označit otázku z jednoho webu jako duplicitní z jiného). Řešení je stejně jednoduché jako zápis (za předpokladu, že jsem ve stejném adresáři jako cílový název souboru):
$ namei -l $(pwd)/somefile ## or `namei -l $(realpath -s somefile)`
Kvůli -l
, uvádí základní oprávnění v dlouhém formátu pro každý nadřazený adresář.
Musím použít pwd
/realpath
protože namei
neřeší relativní cesty. Pokud nejsem v cílovém adresáři, stačí napsat úplnou cestu.
Vytvořil jsem tento malý skript, který to dělá. Používám cd "$1"; pwd
získat aktuální adresář, aby cesty nebyly kanonizovány (řekněme, pokud zkusíte magic-ls .
a váš aktuální adresář je /var/lib/postgres, ale to je symbolický odkaz na /mnt/postgres, dostanete /var
, /var/lib
a /var/lib/postgres
, při použití realpath
dostali byste /mnt
a /mnt/postgres
)
magic-ls() {
local current=$(cd "$1"; pwd)
while [[ $current != '/' ]]; do
ls -ld "$current"
current=$(dirname "$current")
done
}
Zde je příklad výstupu:
[[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
Mimochodem, od cd ""
bude fungovat také bez argumentu nezmění váš adresář.
Edit:odstraněno realpath
z kontroly while, protože to by mohlo vést k neočekávaným výsledkům, pokud by existoval odkaz na /
v cestě a byl nepotřebný.
Stačí použít rozšíření parametrů:
#!/usr/bin/env bash
path="$1"
while test -n "$path"; do
ls -lLd "$path"
path="${path%/*}"
done
volání metody :
bash test.sh /var/lib/program/subfolder/somefile
dává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 /var
Napsal jsem pro vás bash skript. Bude to mít nějaké chyby, pokud máte mezeru ve jménech. Pokud vám to vadí, budu rád za doporučení změn v komentářích.
#!/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
S realpath -s
můžete chytit absolutní cestu, ale nebudete následovat odkaz. Pokud není zadán žádný argument, použijeme pwd jako soubor/adresář k výpisu.
Každou cestu připojíme k seznamu. To nám dává výhodu lepšího rozložení na konci, takže získáme pěknou tabulku, protože spouštíme ls
pouze jednou.
Výstup:
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