如何打印目录中所有符号链接文件的原始文件?

如何打印目录中所有符号链接文件的原始文件?

有一个目录仅包含符号链接文件。

我想从该目录传递 ls 命令,并将其作为 readlink 命令打印原始文件的一个因素

我尝试了下面的命令,但找不到答案

$ ls opt/integrity/ | xargs readlink

有谁知道通过 ls 和 readlink 命令为目录中存在的所有文件输出原始文件的适当命令

答案1

如果您的意思是要列出符号链接及其指向的目标路径,请使用zsh

$ zmodload zsh/stat
$ stat -n +link /dev/*(@)
/dev/cdrom sr0
/dev/core /proc/kcore
/dev/fd /proc/self/fd
/dev/initctl /run/initctl
/dev/log /run/systemd/journal/dev-log
/dev/rtc rtc0
/dev/stderr /proc/self/fd/2
/dev/stdin /proc/self/fd/0
/dev/stdout /proc/self/fd/1

通过 ast-open 的实现ls,您还可以执行以下操作:

$ ls -d --format='%(name)s %(linkpath)s' /dev/*(@)
/dev/cdrom sr0
/dev/core /proc/kcore
/dev/fd
/dev/initctl /run/initctl
/dev/log /run/systemd/journal/dev-log
/dev/rtc rtc0
/dev/stderr /proc/self/fd/2
/dev/stdin /proc/self/fd/0
/dev/stdout /proc/self/fd/1

使用 GNU find

$ find /dev/ -maxdepth 1 -type l -printf '%p %l\n'
/dev/cdrom sr0
/dev/rtc rtc0
/dev/log /run/systemd/journal/dev-log
/dev/initctl /run/initctl
/dev/core /proc/kcore
/dev/stderr /proc/self/fd/2
/dev/stdout /proc/self/fd/1
/dev/stdin /proc/self/fd/0
/dev/fd /proc/self/fd

(未排序,包括隐藏文件(如果有)。

使用 GNU stat

$ command stat -c %N /dev/*(@)
'/dev/cdrom' -> 'sr0'
'/dev/core' -> '/proc/kcore'
'/dev/fd' -> '/proc/self/fd'
'/dev/initctl' -> '/run/initctl'
'/dev/log' -> '/run/systemd/journal/dev-log'
'/dev/rtc' -> 'rtc0'
'/dev/stderr' -> '/proc/self/fd/2'
'/dev/stdin' -> '/proc/self/fd/0'
'/dev/stdout' -> '/proc/self/fd/1'

path/to/*(@)扩展到非隐藏文件类型符号链接path/to目录中,使用@glob 限定符。该功能是zsh特定的。在其他 shell 中,您通常需要find根据文件的类型来选择文件。

例如,在 bash 4.4+ 和 GNU 系统上,扩展的等效/dev/*(@)内容如下:

readarray -td '' files < <(
  LC_ALL=C find /dev/ -mindepth 1 -maxdepth 1 ! -name '.*' -type l -print0 |
    sort -z
)
if (( ${#files[@]} )); then
  stat -c %N -- "${files[@]}"
else
  echo>&2 No match.
fi

答案2

绝对没有必要使用ls来列出文件readlink(它的目的是为人们而不是机器提供方便的文件列表)。相反,您可以让 shell 扩展*以匹配目录中的所有文件

readlink opt/integrity/*

如果路径opt/integrity存在并且源文件名不包含空格(或其他“特殊”字符),您的原始命令可能会起作用。但通配符已经可以处理这个问题,因此是一个更安全的解决方案。

相关内容