Ls

僅使用 ls 顯示源文件和目標連結文件

  • January 12, 2018

我可以顯示連結指向的目標文件ls -l

snowch$ ls -l /usr/local/bin/mvn
lrwxr-xr-x  1 snowch  admin  29 12 Dec 08:58 /usr/local/bin/mvn -> ../Cellar/maven/3.2.3/bin/mvn

有沒有一種方法可以顯示更少的輸出,而不必通過另一個命令(例如 awk)進行管道傳輸?例如:

snowch$ ls ?? /usr/local/bin/mvn
/usr/local/bin/mvn -> ../Cellar/maven/3.2.3/bin/mvn

我在 OS X 10.9.5 上執行 3.2.53。幾個命令的輸出如下所示:

snowch$ ls -H /usr/local/bin/mvn
/usr/local/bin/mvn

snowch$ ls -L /usr/local/bin/mvn
/usr/local/bin/mvn

snowch$ file /usr/local/bin/mvn
/usr/local/bin/mvn: POSIX shell script text executable

snowch$ file -b /usr/local/bin/mvn
POSIX shell script text executable

ls不幸的是,沒有選項可以檢索文件屬性並以任意方式顯示它們。一些系統為此有單獨的命令(例如 GNU 有一個stat命令或 GNU 中的功能find)。

在大多數具有大多數文件的現代系統上,這應該可以工作:

$ ln -s '/foo/bar -> baz' the-file
$ LC_ALL=C ls -ldn the-file | sed '
  1s/^\([^[:blank:]]\{1,\}[[:blank:]]\{1,\}\)\{8\}//'
the-file -> /foo/bar -> baz

這通過刪除輸出的第一行的前 8 個空白分隔欄位來工作ls -l。這應該可以工作,除非系統中沒有顯示 gid,或者當有大量連結時前 2 個欄位連接在一起。

使用 GNU stat

$ LC_ALL=C stat -c '%N' the-file
'the-file' -> '/foo/bar -> baz'

使用 GNU find

$ find the-file -prune \( -type l -printf '%p -> %l\n' -o -printf '%p\n' \)
the-file -> /foo/bar -> baz

使用 FreeBSD/OS/X 統計數據:

f=the-file
if [ -L "$f" ]; then
 stat -f "%N -> %Y" -- "$f"
else
 printf '%s\n' "$f"
fi

zsh統計:

zmodload zsh/stat
f=the-file
zstat -LH s -- "$f"
printf '%s\n' ${s[link]:-$f}

許多系統也有readlink專門獲取連結目標的命令:

f=the-file
if [ -L "$f" ]; then
 printf '%s -> ' "$f"
 readlink -- "$f"
else
 printf '%s\n' "$f"
fi

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