有一个目录仅包含符号链接文件。
我想从该目录传递 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
存在并且源文件名不包含空格(或其他“特殊”字符),您的原始命令可能会起作用。但通配符已经可以处理这个问题,因此是一个更安全的解决方案。