2つのパスが同じファイルを指しているかどうかを確認します


12

ホームディレクトリに設定ディレクトリへのシンボリックリンクを再帰的に作成して、ファイルをバージョン管理下に置くためのスクリプトがあります。親ディレクトリを介してすでにシンボリックリンクされているファイルをスキップしたいと思います。つまり、これらのファイル/ディレクトリがある場合:

~/foo/ -> ~/settings/foo/
~/settings/foo/
~/settings/foo/bar

、〜/ foo / barと〜/ settings / foo / barが同じファイルであることを確認するにはどうすればよいですか?

編集:ドー、さらに数分の検索で答えが明らかになりました:readlink -f $path

回答:


6

2つのファイルが同じdeviceIDとinodeを持つ場合、それらは同じファイルです。statコマンドラインツールを見つけるのは、これが容易になります

if [ "$(stat -c "%d:%i" FILE1)" == "$(stat -c "%d:%i" FILE2)" ]`

...

これは、シンボリックリンクファイルまたはハードリンクファイルに対して機能します。


5
シンボリックリンクをたどるには、が必要stat -Lです。
ジル「SO-悪であるのをやめる」

@Gillesが言ったように、-Lスイッチなしでは、一部のディストリビューションで間違った結果が得られる場合があります
Olaseni

18

多くのシェルには、2つのパスが(シンボリックリンクをたどって)同じ既存のファイルを指しているかどうかをテストする-efためのtest組み込み(またはその同義語[)の演算子があります。これには、bash、dash、pdksh、ksh88、ksh93、およびzshが含まれますが、POSIX shは含まれません。bash、ksh、またはzshでは、条件付き構文でも使用できます。-ef[[ … ]]

if ! [ "$1" -ef "$2" ]; then # $1 and $2 are different files

1
私のマンページによると、-efはRich Homolkaの答えとまったく同じことを行います。
user13852

2
@ user13852に-efは、よりポータブルであるという利点があります(また、わずかに高速ですが、ほとんどの場合気付かないほどではありません)。たとえば、* BSD、OSX、BusyBoxおよびLinux / Cygwin(GNU)で動作します。また、必要なことを正確に行うため、より明確です。呼び出すことでわかる唯一の利点statは、シンボリックリンクをたどりたくない場合です。
ジル 'SO-悪であるのをやめる'

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.