如何在长路径中找到第一个丢失的目录?

kuz*_*roo 16 ls shell bash directory

想象一下,我有一条不存在的路径:

$ ls /foo/bar/baz/hello/world
ls: cannot access /foo/bar/baz/hello/world: No such file or directory
Run Code Online (Sandbox Code Playgroud)

但可以说/foo/bar 确实存在。有没有一种快速的方法可以让我确定那baz是路径中的断点?

我正在使用 Bash。

mur*_*uru 13

我最喜欢的实用程序之一是namei,它的一部分,util-linux因此通常只出现在 Linux 上:

$ namei /usr/share/foo/bar
f: /usr/share/foo/bar
 d /
 d usr
 d share
   foo - No such file or directory
Run Code Online (Sandbox Code Playgroud)

但它的输出不是很容易解析。所以,如果你只是想指出缺少的东西,namei可能会有用。

它对于解决访问路径中的一般问题很有用,因为您可以让它说明组件是链接还是挂载点,以及它的权限:

$ ln -sf /usr/foo/bar /tmp/
$ namei -lx /tmp/bar
f: /tmp/bar
Drwxr-xr-x root    root    /
Drwxrwxrwt root    root    tmp
lrwxrwxrwx muru    muru    bar -> /usr/foo/bar
Drwxr-xr-x root    root      /
drwxr-xr-x root    root      usr
                             foo - No such file or directory
Run Code Online (Sandbox Code Playgroud)

大写D表示挂载点。


mik*_*erv 5

给定一个规范的路径名,比如你的,这将起作用:

set -f --; IFS=/
for p in $pathname
do    [ -e "$*/$p" ] || break
      set -- "$@" "$p"
done; printf %s\\n "$*"
Run Code Online (Sandbox Code Playgroud)

这会打印 的最后一个完全存在/可访问的组件$pathname,并将每个组件分别放入 arg 数组中。不打印第一个不存在的组件,但将其保存在$p.

你可能会反其道而行之:

until cd -- "$path" && cd -
do    case   $path  in
      (*[!/]/*)
              path="${path%/*}"
;;    (*)   ! break
      esac
done  2>/dev/null   && cd -
Run Code Online (Sandbox Code Playgroud)

这将适当地返回或将$path根据需要削减。它拒绝尝试更改/,但如果成功将打印您当前的工作目录和它更改为标准输出的目录。您的电流$PWD也将被放入$OLDPWD