2009-07-14 7 views
3

Unixの2つのシンボリックリンクを比較するうまい方法は何でしょうか? 、unix(Linux)で2つのシンボリックリンクを比較するには?

ln -s /usr/share/g s1 
ln -s /usr/share/g s2 
ln -s ../share/g /usr/lib/s3 
ln -s /usr/share/h s4 

その後、私はs1とs2が等しいと言うコマンドを持っていると思います(を/ usr/share/gが実際に存在するかどうかは関係ありません):

は、私は次のコマンドを入力したと仮定しますs1とs4は等しくなく、s2とs4は等しくない。 (私の目的では、s3がs1とs2と異なると報告されていれば十分ですが、パス正規化後の比較を行うことができれば便利です)

答えて

12

を使用して2つの変数を比較することができます(そしておそらく他の人が、私が言うことはできません)を見つける使用され、readlink(1)があります:

$ touch a 
$ ln -s a b 
$ readlink b 
a 

あなたは比較でそれを使用することができます

$ test $(readlink -f a) = $(readlink -f b) 
$ echo $? 
0 
+1

+1おっと、私はそのことについて知らなかった! – DrAl

+0

ありがとう!これは私が探していたものです。 –

+0

stat(readlink)ユーティリティは、NetBSD 1.6で登場しました。 –

3

ファイルに対してstat -Lを実行し、デバイスとiノード番号。 クイック例:

#!/bin/bash 
DI_A=$(stat -c "%d.%i" -L "$1") 
DI_B=$(stat -c "%d.%i" -L "$2") 

if [ "$DI_A" == "$DI_B" ]; then 
    echo "same file" 
else 
    echo "other file" 
fi 
+1

リンクが絡まっても動作しないようです。 –

0

いずれstat -Lを使用するか、ls -lの出力を解析(SEDまたは切断または類似の):

fileone=`ls -l s1 | sed 's/.*-> //'` 
filetwo=`ls -l s2 | sed 's/.*-> //'` 
if [ "$fileone" = "$filetwo" ] 
then 
    echo "They're the same!" 
fi 

パスを正規化するために、実パス使用:

fileone=`ls -1 s1 | sed 's/.*-> //'` 
fileone=`realpath $fileone` 
# etc... 
+0

は、 " - >" ...を含むファイル名で壊れてしまいます。 –

+0

True ...私はこれまでに - >ファイルを持っているとは言えません。 Readlinkは確かに行く方法です。 – DrAl

-1

2つの方法が考えられます。両方のファイルでls -lを使うことができます。 「 - >」出力の実際のpath.eg

# ls -ltr msdfasdffff 
lrwxrwxrwx 1 root root 10 Jun 30 19:05 msdfasdffff -> blah.sh 

あなたは、あなたが他のリンクと比較することができ

# ls -l msdfasdffff | awk -F"-> " '{print $NF}' 
blah.sh 

を使用してファイル名を取得することができ、あなたは後に見ることができます。

他の方法は

# var1=$(find . -name "s1" -printf "%l") 
# var2=$(find . -name "s2" -printf "%l") 

、あなたはGNUシステムであれば/他

+0

thxですが、awk-methodは部分文字列として " - >"を含むファイル名を分割します。 findメソッドは機能しますが、検索を1つのファイルに制限する条件がいくつかあります。私はその後、readlinkコマンドを好むだろう。 –

関連する問題