in reply to Detecting whether two pathes refer to the same file

If you are looking to test whether the two paths are referring to the same location (as opposed to the two paths referring to two separate, but identical, files) you could use Cwd::abs_path() on both, then test whether the paths returned are the same. Example:

#!perl use strict; use warnings; use feature qw(:5.12); use Cwd qw(abs_path); say abs_path ('/foo') eq abs_path ('/bar/../foo');

You could also check out some of the File::* modules for working with files, directories, paths, etc.

Update: Link fixed.

Replies are listed 'Best First'.
Re^2: Detecting whether two pathes refer to the same file
by ikegami (Patriarch) on Sep 10, 2010 at 16:14 UTC

    It's a good solution, but I can think of two limitations.

    • That will work for symbolic links (on most devices), but not for hard links (other than "." and "..").

      $ echo foo > a $ ln a b $ cat b foo $ perl -MCwd=abs_path -E'say abs_path($_) for @ARGV' a b /tmp/a /tmp/b

      You might be able to check stat's device plus inode fields to address this limitation on some devices on some systems.

    • It also won't necessarily work across devices (since you could access the same file via two devices). The following all refer to the same file:

      C:\Temp\file \\?\C:\Temp\file # Via UNC path \\localhost\C$\Temp\file # Via localhost \\tribble\C$\Temp\file # Via domain name \\10.0.0.6\C$\Temp\file # Via IP address \\localhost\share\file # Via share Z:\file # Given subst Z: C:\Temp

      In general, this isn't solvable.

      Good points. It depends on whether or not the OP would ever come across those situations.