`ls -l` 用于所有父目录
`ls -l` for all parent directories
我想获取从当前文件夹到 /
的所有目录权限的列表。例如,对于目录:/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
和 /lib
、var
和 lib
,或 /var
和 /var/lib
) .我只对从所选文件或 pwd
到 /
.
的路径中每个 file/directory 的所有权感兴趣
如果我要安装一些程序,我在 Ubuntu 20.04.
我为你写了一个bash脚本。如果您的名称中有 space,它会有一些错误。如果它困扰你,我很高兴在评论中提出更改建议。
#!/bin/bash
if [ ! -z "" ] && [ -e "" ]
then
path=`realpath -s ""` # 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
你可以捕捉到绝对路径,但你不会遵循link。如果没有给出参数,我们将使用 pwd 作为 file/directory 来列出。
我们将每个路径附加到一个列表中。这给了我们最终更好布局的优势,所以我们得到了一个很好的 table 因为我们 运行 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
这应该可行:
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=""
while true ; do
ls -lhd "$fname"
[[ "$fname" == "/" ]] && break ;
fname=$(dirname $(readlink -f "$fname"))
done
}
我制作了这个执行此操作的小脚本。我使用 cd ""; pwd
来获取当前目录,这样路径就不会被规范化(比如,如果你尝试 magic-ls .
而你的当前目录是 /var/lib/postgres,但这是一个 symlink到 /mnt/postgres,你会得到 /var
、/var/lib
和 /var/lib/postgres
,而使用 realpath
你会得到 /mnt
和 /mnt/postgres
)
magic-ls() {
local current=$(cd ""; 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
,因为如果路径中有 link 到 /
并且不需要,这可能会导致意外结果。
#! /bin/bash
cur=""
IFS="/"
path=`pwd`
for dir in ${path:1}
do
cur=$cur/$dir
ls -lhd "$cur"
done
cur=$cur/
ls -lhd "$cur"
航站楼 Session:
$ 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'
仅使用参数扩展:
#!/usr/bin/env bash
path=""
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
此问题已在 superuser.com 中得到解答(我不知道是否可以将来自一个站点的问题标记为与另一个站点重复)。解决方法很简单,写(假设我和目标文件名在同一个目录):
$ namei -l $(pwd)/somefile ## or `namei -l $(realpath -s somefile)`
由于-l
,它以长格式列出每个父目录的基本权限。
我必须使用 pwd
/realpath
因为 namei
不解析相对路径。如果我不在目标目录中,请写完整路径。
只是我的 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
我想获取从当前文件夹到 /
的所有目录权限的列表。例如,对于目录:/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
和 /lib
、var
和 lib
,或 /var
和 /var/lib
) .我只对从所选文件或 pwd
到 /
.
如果我要安装一些程序,我在 Ubuntu 20.04.
我为你写了一个bash脚本。如果您的名称中有 space,它会有一些错误。如果它困扰你,我很高兴在评论中提出更改建议。
#!/bin/bash
if [ ! -z "" ] && [ -e "" ]
then
path=`realpath -s ""` # 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
你可以捕捉到绝对路径,但你不会遵循link。如果没有给出参数,我们将使用 pwd 作为 file/directory 来列出。
我们将每个路径附加到一个列表中。这给了我们最终更好布局的优势,所以我们得到了一个很好的 table 因为我们 运行 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
这应该可行:
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=""
while true ; do
ls -lhd "$fname"
[[ "$fname" == "/" ]] && break ;
fname=$(dirname $(readlink -f "$fname"))
done
}
我制作了这个执行此操作的小脚本。我使用 cd ""; pwd
来获取当前目录,这样路径就不会被规范化(比如,如果你尝试 magic-ls .
而你的当前目录是 /var/lib/postgres,但这是一个 symlink到 /mnt/postgres,你会得到 /var
、/var/lib
和 /var/lib/postgres
,而使用 realpath
你会得到 /mnt
和 /mnt/postgres
)
magic-ls() {
local current=$(cd ""; 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
,因为如果路径中有 link 到 /
并且不需要,这可能会导致意外结果。
#! /bin/bash
cur=""
IFS="/"
path=`pwd`
for dir in ${path:1}
do
cur=$cur/$dir
ls -lhd "$cur"
done
cur=$cur/
ls -lhd "$cur"
航站楼 Session:
$ 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'
仅使用参数扩展:
#!/usr/bin/env bash
path=""
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
此问题已在 superuser.com 中得到解答(我不知道是否可以将来自一个站点的问题标记为与另一个站点重复)。解决方法很简单,写(假设我和目标文件名在同一个目录):
$ namei -l $(pwd)/somefile ## or `namei -l $(realpath -s somefile)`
由于-l
,它以长格式列出每个父目录的基本权限。
我必须使用 pwd
/realpath
因为 namei
不解析相对路径。如果我不在目标目录中,请写完整路径。
只是我的 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