我有一个脚本,用于在我的主目录中递归创建指向我的设置目录的符号链接,以使文件处于版本控制之下。我希望它跳过已经通过父目录进行符号链接的文件。也就是说,如果我有这些文件/目录:
~/foo/ -> ~/settings/foo/
~/settings/foo/
~/settings/foo/bar
,我如何检查 ~/foo/bar 和 ~/settings/foo/bar 是否是同一个文件?
编辑: 哦,又搜索了几分钟,发现了回答:readlink -f $path
答案1
如果两个文件具有相同的设备 ID 和 inode,则它们是同一个文件。stat
命令行工具可以轻松找到这一点,并且此解决方案符合 POSIX shell 标准。
if [ "$(stat -L -c %d:%i FILE1)" = "$(stat -L -c %d:%i FILE2)" ]; then
echo "FILE1 and FILE2 refer to a single file, with one inode, on one device."
else
echo "no match"
fi
-L
每个标志表示stat
这适用于符号链接和硬链接文件。
答案2
许多 shell 都有一个-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
答案3
对于软链接(使用 创建ln -s
),您可以使用realpath
。但这不适用于硬链接。