仅查找符号链接的目的地

ger*_*rit 57 command-line symlink

为了在 shell 脚本中使用,我正在寻找一种命令行方式来获取符号链接的目的地。到目前为止stat -N src,我最接近的是,它输出src -> dst. 当然我可以解析输出并获取dst,但我想知道是否有一些直接的方法可以获取目的地。

nik*_*tiu 69

另一种选择是使用专门设计的命令(readlink如果可用)。

例如

$ readlink -f `command -v php`
/usr/bin/php7.1
Run Code Online (Sandbox Code Playgroud)

  • 如果您想知道 _last_ 符号链接目标,而不仅仅是 _next_ 目标,请使用 `readlink -f`。 (25认同)
  • 请注意,`-f` 是 GNU `readlink` 的不可移植扩展。 (12认同)
  • readlink 什么时候不可用?谢谢。 (2认同)
  • @tommy.carstensen readlink(1) 在 2003 年被添加到 GNU coreutils 中,所以现在你可能会在几乎所有使用 coreutils 的系统上依赖它。(参见 http://git.savannah.gnu.org/cgit/coreutils.git/commit/src/readlink.c?id=2ae02ab5b91daa8dc94ac42496a3ee701c25d1ac) (2认同)
  • `readlink` 可能会给脚本带来麻烦,它会返回相对于链接的链接目的地。`readlink -f` 只给出最终目的地。如果您想在脚本中复制符号链接及其目的地,则符号链接如果指向另一个符号链接就会中断。中间将丢失。 (2认同)

Cor*_*oos 18

在 Mac OS X 和 FreeBSD/NetBSD/等上。它的:

stat -f %Y <filename>
Run Code Online (Sandbox Code Playgroud)

更一般地说,我猜解决方案是(stat --printf=%N 使用奇怪的引号):

ls -l b | sed -e 's/.* -> //'
Run Code Online (Sandbox Code Playgroud)

例子:

# ln -s a b
# stat -f %Y b
a
Run Code Online (Sandbox Code Playgroud)

另一种方法是:

# find b -maxdepth 0 -printf %l
a#
Run Code Online (Sandbox Code Playgroud)

最后一行被破坏了,因为它没有换行符,但是如果你需要一个变量的结果,那很好,就像这样

# f=$(find b -maxdepth 0 -printf %l)
# echo $f
a
Run Code Online (Sandbox Code Playgroud)

如果碰巧是目录,-maxdepth则需要防止find下降到b目录中。


ger*_*rit 5

这可以通过使用GNU做到findfind src -prune -printf "%l\n"