【问题标题】:`ls -l` for all parent directories`ls -l` 用于所有父目录
【发布时间】:2020-10-11 13:06:18
【问题描述】:

我想获取从当前文件夹到/ 的所有目录权限的列表。例如对于目录:/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 下。

【问题讨论】:

  • 除非您澄清somefile 路径中的一个路径组件是符号链接时的预期行为,否则几乎不可能发布此问题的正确答案。
  • @oguzismail 如果是符号链接,我想查看指向的文件或目录的权限。

标签: linux bash ls


【解决方案1】:

superuser.com 已经回答了这个问题(我不知道是否可以将来自一个站点的问题标记为与另一个站点重复)。解决方法就这么简单(假设我和目标文件名在同一个目录下):

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

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

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

【讨论】:

  • 哇,直到今天才听说
  • @oguzismail 是的,有很多不常见的命令实际上非常有用,比如pstree
  • 您可以将$(pwd)/somefile 替换为$(realpath -s somefile)。使用-s,它不会跟随符号链接。
  • 这不是我考虑选择realpath 的唯一原因,您可以解决整个路径,即使它不在您的工作目录中。
  • 也从未听说过namei,真的很酷。使用realpath -s 的问题在于,如果它是您调用它的文件/目录,它不会解析符号链接,但它仍然会遵循父目录的符号链接。因此,例如,如果您位于 /home/leo/test/,而 /home/leo 是指向 /mnt/leo 的符号链接,则 realpath -s . 将为您提供 /mnt/leo/test 而不是 /home/leo/test
【解决方案2】:

我制作了这个小脚本来执行此操作。我使用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,因为如果路径中有指向 / 的链接并且不需要,这可能会导致意外结果。

【讨论】:

  • 是的,如果 $1 不是目录,它将失败,我没有介绍那种情况。但是,ls -ld 会在此处打印符号链接。请记住,它将使用符号链接的绝对路径调用,也许您以另一种方式进行了测试?
  • 我的错,没错。 realpath 将取消引用符号链接,而 OP 是否想要这样做根本不清楚。
  • 是的,没错,如果路径中有/的链接,可能会导致意想不到的结果。我会改变的。
  • 你可以使用realpath -s来保留符号链接的路径。
  • 我不知道realpath -s,谢谢!在这种情况下,它本质上等同于变量本身,因为我只需要检查/,所以我将离开
【解决方案3】:

我为你写了一个 bash 脚本。如果名称中有空格,它会有一些错误。如果这让您感到困扰,我很高兴收到 cmets 中的更改建议。

#!/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

【讨论】:

    【解决方案4】:

    只使用参数扩展:

    #!/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
    

    【讨论】:

      【解决方案5】:
      #! /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'
      

      【讨论】:

        【解决方案6】:

        这应该可行:

        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
        }
        

        【讨论】:

        • 首先我也想到了类似的东西。这里的问题是,最终,您不再处于您的目录中,并且您也将整个文件放在该文件夹中。你知道ls-d 选项吗?我是针对这个特定问题学习的。
        • Boba Fit,啊,我没有注意到它正在递归地打印目录。我会更新我的答案。
        • 哦,我一开始误解了你的问题。您只需要指定路径中每个组件的权限。我会看看我能做什么。
        【解决方案7】:

        只有我的 2 美分。我的 mac 没有 namei 命令(也许 homebrew 有一个副本),但想制作一个快速版本,以自上而下的顺序对齐输出

        #!/usr/bin/env bash
        path="${1%/}"
        DIRS=()
        while test -n "$path"; do
          DIRS=( "$path" "${DIRS[@]}" )
          path="${path%/*}"
        done
        ls -ld "${DIRS[@]}"
        

        示例输出:

        $ lspath $TMPDIR
        lrwxr-xr-x@   1 root  wheel    11 Oct  5  2018 /var -> private/var
        drwxr-xr-x    7 root  wheel   224 Jul 16  2020 /var/folders
        drwxr-xr-x@   3 root  wheel    96 Apr  5  2018 /var/folders/0c
        drwxr-xr-x@   5 me    staff   160 Apr  5  2018 /var/folders/0c/2_s_qxd11m3d1smzqdrs3qg40000gp
        drwx------@ 255 me    staff  8160 Oct  7 09:18 /var/folders/0c/2_s_qxd11m3d1smzqdrs3qg40000gp/T
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-30
          • 1970-01-01
          • 2022-06-17
          • 2012-11-23
          相关资源
          最近更新 更多