Bash

如何在長路徑中找到第一個失去的目錄?

  • February 7, 2016

想像一下,我有一條不存在的路徑:

$ ls /foo/bar/baz/hello/world
ls: cannot access /foo/bar/baz/hello/world: No such file or directory

但是假設/foo/bar 確實存在。有沒有一種快速的方法可以讓我確定這baz是路徑中的斷點?

我正在使用 Bash。

給定一個規範的路徑名,比如你的,這將起作用:

set -f --; IFS=/
for p in $pathname
do    [ -e "$*/$p" ] || break
     set -- "$@" "$p"
done; printf %s\\n "$*"

這會列印出 的最後一個完全存在/可訪問的組件$pathname,並將每個組件分別放入 arg 數組中。不列印第一個不存在的組件,但將其保存在$p.

您可能會相反地處理它:

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

這將適當地返回或$path根據需要減少。它拒絕嘗試更改到/,但如果成功,會將您目前的工作目錄和它更改到的目錄列印到標準輸出。您的電流$PWD也將被輸入$OLDPWD

我最喜歡的實用程序之一是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

但它的輸出不是很容易解析。所以,如果你只是想指出缺少的東西,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

大寫D字母表示安裝點。

引用自:https://unix.stackexchange.com/questions/259735