GNU/Linux >> Znalost Linux >  >> Linux

`ls -l` pro všechny nadřazené adresáře

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

Linux
  1. Odebrat všechny soubory/adresáře kromě jednoho souboru?

  2. Jak vytvořit oddíl Ext4 pro všechny uživatele?

  3. Jaké je výchozí kořenové heslo pro MySQL 5.7

  1. Kde je .bashrc pro root?

  2. root heslo nefunguje pro su v terminálu

  3. Povolit jednoduché heslo pro uživatele root na CentOS

  1. Vyhrazený prostor pro root na souborovém systému – proč?

  2. Je možné, aby root provedl příkaz jako jiný než root?

  3. Jak vypíšu všechny uživatele s rootem?