`ls -l` 适用于所有父目录

Per*_*-lk 13 linux bash ls

我想获取从当前文件夹到/. 例如,对于目录:/var/lib/program/subfolder,我想要一个输出,例如:

$ 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
Run Code Online (Sandbox Code Playgroud)

我不在乎顺序(从/var/subfolder或相反)、硬链接的数量甚至日期。我只是将它们写下来以模拟ls -l输出。另外,我不在乎每个文件名如何打印(/var/libvarlib、或/var/var/lib)。我只对所选文件的路径中每个文件/目录的所有权或pwd/.

如果我应该安装一些程序,我在 Ubuntu 20.04 下。

Per*_*-lk 8

这个问题已经在superuser.com 中得到了回答(我不知道我是否可以将一个站点的问题标记为与另一个站点的重复)。解决方案就像写一样简单(假设我与目标文件名在同一目录中):

$ namei -l $(pwd)/somefile ## 或 `namei -l $(realpath -s somefile)`

因为-l,它以长格式列出了每个父目录的基本权限。

我必须使用pwd/realpath 因为namei不解析相对路径。如果我不在目标目录中,只需写下完整路径。


小智 5

我为你写了一个 bash 脚本。如果名称中有空格,它会有一些错误。如果它打扰您,我很高兴在评论中提出更改建议。

#!/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
Run Code Online (Sandbox Code Playgroud)

使用realpath -s您可以捕获绝对路径,但您不会遵循链接。如果没有给出参数,我们将使用 pwd 作为要列出的文件/目录。

我们将每个路径附加到一个列表中。这给了我们最终更好的布局的优势,这样我们就能得到一张漂亮的表,因为我们ls只运行一次。

输出:

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
Run Code Online (Sandbox Code Playgroud)


Leo*_*ino 5

我制作了这个小脚本来做到这一点。我cd "$1"; pwd用来获取当前目录,这样路径就不会被规范化(比如说,如果你尝试magic-ls .你的当前目录是 /var/lib/postgres,但它是 /mnt/postgres 的符号链接,你会得到/var, /var/liband /var/lib/postgres,同时使用realpath你会得到/mnt/mnt/postgres)

magic-ls() {
    local current=$(cd "$1"; pwd)

    while [[ $current != '/' ]]; do
        ls -ld "$current"
        current=$(dirname "$current")
    done
}
Run Code Online (Sandbox Code Playgroud)

这是一个示例输出:

[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
Run Code Online (Sandbox Code Playgroud)

顺便说一下,它也可以在没有参数的情况下工作,因为cd ""它不会更改您的目录。

编辑:realpath从 while 检查中删除,因为如果/路径中有链接,则可能会导致意外结果,并且不需要。