ファイルが他のリンクへのリンクであるかどうかをテストしたいと思います。 readlinkを試しましたが、必要な方法で動作しません。
[email protected],1:~/subdir1 $ ll
lrwxrwxrwx 1 pi pi 13 Apr 10 14:34 hellolink -> subdir2/hello
lrwxrwxrwx 1 pi pi 9 Apr 10 14:34 hellolink2 -> hellolink
drwxr-xr-x 2 pi pi 4096 Apr 10 14:33 subdir2
readlinkを使用すると、最終ターゲットの完全修飾形式または次のリンクのデフォルトのファイル名を取得できるようになりました。
[email protected],1:~/subdir1 $ readlink -f hellolink2
/home/ralph/subdir1/subdir2/hello
[email protected],1:~/subdir1 $ readlink hellolink2
hellolink
しかし、私にとって必要なのは、hellolink2が指すファイルのフルパスです。
/home/ralph/subdir1/hellolink
今私は次のようなことをしています。
if [ -h "$(dirname hellolink2)/$(readlink hellolink2)" ] ; then
echo hellolink2 is a link
fi
ループでこれを何度も実行し、findを使用してファイル名を指定すると、オーバーヘッドがたくさん発生するようです。
より簡単な方法がありますか?
答え1
ファイルがシンボリックリンクであることを確認するには、test -L(readlinkなし)を使用してください。
if [ -L hellolink2 ]
ディレクトリシンボリックリンクの絶対パスを取得するには、 realpath を使用します。
$ realpath hellolink2
/home/ralph/subdir1/hellolink
答え2
それが価値があるかどうか...上記のコメントの提案に従って、リンクが指すファイルを取得できるようにコードを書き直しました。他のリンクであってもテストする数行を加えたものです。
#!/bin/bash
function nextlinked ()
{
if [ -h "$1" ]; then # we have a link
linked="$(readlink "$1")"
[ "${linked:0:1}" == / ] && echo "$linked" || echo "${1%/*}"/"$linked"
fi
}
header=""
add=" "
count=0
find / -print0 | while read -rd '' FILENAME ; do
(( count++ ))
if [ -h "$FILENAME" ] ; then # is this a link?
filename="$FILENAME"
printf "%6d " $count ; ls -ld "$filename" 2>&1
filename="$(nextlinked "$filename" )"
while [ "$filename" ] ; do
header=$header$add
printf "%6d %s" $count "$header" ; ls -ld "$filename" 2>&1
filename="$(nextlinked "$filename")"
done
header=""
fi
done
質問はまだ残っています。 nextlinked関数の操作を実行できる既存のLinuxコマンドはありますか?