l0b*_*0b0 13 linux symbolic-link
我有一个脚本可以在我的主目录中递归创建符号链接到我的设置目录,以保持文件处于版本控制之下。我希望它跳过已经通过父目录进行符号链接的文件。也就是说,如果我有这些文件/目录:
~/foo/ -> ~/settings/foo/
~/settings/foo/
~/settings/foo/bar
Run Code Online (Sandbox Code Playgroud)
, 我如何检查 ~/foo/bar 和 ~/settings/foo/bar 是同一个文件?
编辑:D'oh,又经过几分钟的搜索揭示了答案:readlink -f $path
Gil*_*il' 21
许多 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
Run Code Online (Sandbox Code Playgroud)
Ric*_*lka 10
如果两个文件具有相同的 deviceID 和 inode,则它们是同一个文件。该stat
命令行工具使这很容易找到,这个解决方案是壳POSIX兼容。
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
Run Code Online (Sandbox Code Playgroud)
-L
每个中的标志stat
意味着这适用于符号链接和硬链接文件。