シンボリックリンクファイルのみを含むディレクトリがあります。
そのディレクトリからlsコマンドを渡し、それをreadlinkコマンドの要素として使用して元のファイルを印刷したいと思います。
次のコマンドを試しましたが、答えが見つかりません
$ ls opt/integrity/ | xargs readlink
ディレクトリ内のすべてのファイルに対して、lsコマンドとreadlinkコマンドを介してrawファイルを出力する適切なコマンドを知っている人はいますか?
答え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
具体的です。他のシェルでは通常、その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
(その目的は、マシン以外の人に便利なファイルリストを提供することです)。代わりに、*
ディレクトリ内のすべてのファイルと一致するようにシェルを拡張できます。
readlink opt/integrity/*
パスが存在し、ソースファイル名にスペース(または他の「特殊」文字)が含まれていない場合、元のコマンドが機能する可能性がopt/integrity
あります。ただし、ワイルドカードはすでにこれを処理しているため、より安全なソリューションです。