检查两个路径是否指向同一个文件


12

我有一个脚本可以在我的主目录中递归地创建到我的设置目录的符号链接,以使文件受版本控制。我希望它跳过已经通过父目录进行符号链接的文件。也就是说,如果我有以下文件/目录:

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

,如何检查〜/ foo / bar和〜/ settings / foo / bar是同一文件?

编辑:D'oh,另外几分钟的搜索显示了答案readlink -f $path

Answers:


6

如果两个文件具有相同的deviceID和inode,则它们是同一文件。使用stat命令行工具可以轻松找到

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

...

这适用于符号链接文件或硬链接文件。


5
要跟踪符号链接,您需要stat -L
吉尔(Gilles)“所以,别再邪恶了”,2010年

就像@Gilles所说的那样,如果没有-L开关,您可能会在某些发行版上得到错误的结果
Olaseni

19

许多外壳程序都有一个内置-ef运算符test(或其同义词[),用于测试两个路径是否指向同一现有文件(在符号链接之后)。这包括bash,破折号,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 2013年

2
@ user13852 -ef的优点是更具可移植性(也稍快一些,但大多数时候您不会注意到)。例如,它可以在* BSD,OSX,BusyBox以及Linux / Cygwin(GNU)上运行。它也更加清晰,因为它确实满足了要求。我可以看到的唯一好处stat是,当您不想遵循符号链接时。
吉尔(Gilles)'所以

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.