Bash
如何在長路徑中找到第一個失去的目錄?
想像一下,我有一條不存在的路徑:
$ 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
字母表示安裝點。