所有父目录的`ls -l`

时间:2020-06-21 16:29:28

标签: 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

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

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

6 个答案:

答案 0 :(得分:7)

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

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

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

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

答案 1 :(得分: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

使用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

答案 2 :(得分:4)

我做了这个小脚本。我使用cd "$1"; pwd来获取当前目录,以便路径无法规范化(例如,如果您尝试magic-ls .且当前目录为/ var / lib / postgres,但这是/ mnt /的符号链接postgres,您将获得/var/var/lib/var/lib/postgres,而使用realpath则将获得/mnt/mnt/postgres

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

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

这是示例输出:

[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

由于cd ""不会更改您的目录,因此它也将不带任何参数。

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

答案 3 :(得分:2)

只需使用参数扩展即可:

#!/usr/bin/env bash
path="$1"
while test -n "$path"; do
    ls -lLd "$path"
    path="${path%/*}"
done

调用方法:

bash test.sh /var/lib/program/subfolder/somefile

给予

-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

答案 4 :(得分:1)

这可能应该起作用:

pwd ; ls -lh ; while true ; do  cd .. ; pwd ; ls -lh ; [[ "$PWD" == "/" ]] && break ; done

编辑:起初我误解了这个问题。试试这个:

(pwd ; ls -ldh ; while true ; do cd .. ; pwd ; ls -ldh ; [[ "$PWD" == "/" ]] &&
break ; done ; cd "$START")

EDIT2:fillipe的答案可能是最好的,但这是我的第三次也是最后一次尝试,它对文件和目录均有效:

magic_ls() {
fname="$1"
while true ; do
ls -lhd "$fname"
[[ "$fname" == "/" ]] && break ;
fname=$(dirname $(readlink -f "$fname"))
done
}

答案 5 :(得分:1)

#! /bin/bash

cur=""
IFS="/"
path=`pwd`

for dir in ${path:1}
do
        cur=$cur/$dir
        ls -lhd "$cur"
done

cur=$cur/$1
ls -lhd "$cur"

终端会议:

$ pwd 
/tmp/dir_underscore/dir space/dir special @!)
$ ls 
bash.sh  test.txt
$ ./bash.sh test.txt
drwxrwxrwt 28 root root 36K Jun 21 22:45 /tmp
drwxr-xr-x 3 root root 4.0K Jun 21 22:27 /tmp/dir_underscore
drwxr-xr-x 3 root root 4.0K Jun 21 22:28 '/tmp/dir_underscore/dir space'
drwxr-xr-x 2 root root 4.0K Jun 21 22:54 '/tmp/dir_underscore/dir space/dir special @!)'
-rw-r--r-- 1 root root 0 Jun 21 22:29 '/tmp/dir_underscore/dir space/dir special @!)/test.txt'