ディレクトリ内のすべてのシンボリックリンクファイルの生ファイルを印刷するには?

ディレクトリ内のすべてのシンボリックリンクファイルの生ファイルを印刷するには?

シンボリックリンクファイルのみを含むディレクトリがあります。

そのディレクトリから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

おすすめ記事