`ls -l` 一个文件和所有指向它的目录?

Rma*_*ano 5 shell bash zsh

在我开始编写(可能很简单)脚本之前,是否有一个命令可以执行以下操作:

[:~/software/scripts] % ls -ld / /usr /usr/bin /usr/bin/tee 
drwxr-xr-x 21 root root  4096 Mar 31 08:48 /
drwxr-xr-x 11 root root  4096 Jan 30 09:48 /usr
drwxr-xr-x  2 root root 73728 Apr 14 07:54 /usr/bin
-rwxr-xr-x  1 root root 26308 Jan 16  2013 /usr/bin/tee
Run Code Online (Sandbox Code Playgroud)

无需手动输入所有部分路径?这个想法是能够说

ls --this-new-flag /usr/bin/tee  
Run Code Online (Sandbox Code Playgroud)

或者

command -l /usr/bin/tee 
Run Code Online (Sandbox Code Playgroud)

并具有上面的输出 --- 显示了通向最终路径的所有部分路径的详细列表。可以输出/ /usr /usr/bin /usr/bin/tee给定的shell 扩展技巧也可以/usr/bin/tee

And*_*rey 4

ls -ld `echo 'path/to/file' | sed ':0 p;s!/[^/]*$!!;t0' | sort -u`
Run Code Online (Sandbox Code Playgroud)

sed部分:

  • :0标签0;
  • p打印;
  • s!p!r!p用替换替换模式r
  • /[^/]*$搜索/,然后搜索任何 not- 序列/直到行尾;
  • replacement 为空,所以直接删除匹配;
  • t0如果s!!!执行替换,则转到 label 0

评论后由OP编辑

我做了以下操作(感谢评论,尤其是 Jander 和 Andrey 的评论):

explode() {echo "$1" | sed -n ':0 p;s![^/]\+/*$!!;t0' | sort -u}
Run Code Online (Sandbox Code Playgroud)

到我.zshrc的然后我可以使用

ls -ld $(explode /path/to/file) 
Run Code Online (Sandbox Code Playgroud)

并具有所需的输出。

  • `sed -n ':0 p;s![^/]\+/*$!!;t0'` 清理一些极端情况:打印根;删除多个/尾部斜杠;不再需要“sort -u”。 (2认同)