如何通过 ls 查看实际的硬链接?

如何通过 ls 查看实际的硬链接?

我跑

ln /a/A /b/B

我想查看a文件 A 指向的文件夹ls

答案1

您可以使用以下命令查找文件的 inode 编号

ls -i

ls -l

显示引用计数(特定 inode 的硬链接数)

找到 inode 编号后,您可以搜索具有相同 inode 的所有文件:

find . -inum NUM

将显示当前目录中 inode NUM 的文件名 (.)

答案2

您的问题实际上没有明确的答案。与符号链接不同,硬链接与“原始文件”没有区别。

目录条目由文件名和指向 inode 的指针组成。inode 又包含文件元数据和(指向)实际文件内容的指针)。创建硬链接会创建另一个引用相同 inode 的目录条目。这些引用是单向的(至少在典型的文件系统中)——inode 只保留引用计数。没有内在的方法来找出哪个是“原始”文件名。

顺便说一句,这就是为什么“删除”文件的系统调用被称为unlink。它只是删除一个硬链接。只有当 inode 的引用计数降至 0 时,才会删除 inode 和附加数据。

查找对给定 inode 的其他引用的唯一方法是彻底搜索文件系统,检查哪些文件引用了相关 inode。您可以使用 shell 中的“test A -ef B”执行此检查。

答案3

UNIX 有硬链接和符号链接(分别用"ln"和建立"ln -s")。符号链接只是一个包含另一个文件真实路径的文件,可以跨文件系统。

硬链接自 UNIX 早期就存在了(至少我记得,那是很久以前的事情了)。它们是两个目录条目,引用精确的相同的底层数据。文件中的数据由其指定inode。文件系统上的每个文件都指向一个 inode,但不要求每个文件都指向唯一的 inode - 这就是硬链接的来源。

由于 inode 仅对给定的文件系统是唯一的,因此存在一个限制,即硬链接必须位于同一文件系统上(与符号链接不同)。请注意,与符号链接不同,硬链接没有特权文件 - 它们都是平等的。只有在以下情况下才会释放数据区:全部使用该 inode 的文件将被删除(并且所有进程也将其关闭,但这是另一个问题)。

您可以使用该"ls -i"命令获取特定文件的 inode。然后可以使用该"find <filesystemroot> -inum <inode>"命令查找文件系统上具有该给定 inode 的所有文件。

下面是一个可以完成这个任务的脚本。你可以使用以下命令调用它:

findhardlinks ~/jquery.js

它将找到文件系统上所有与该文件硬链接的文件:

pax@daemonspawn:~# ./findhardlinks /home/pax/jquery.js
Processing '/home/pax/jquery.js'
   '/home/pax/jquery.js' has inode 5211995 on mount point '/'
       /home/common/jquery-1.2.6.min.js
       /home/pax/jquery.js

这是脚本。

#!/bin/bash
if [[ $# -lt 1 ]] ; then
    echo "Usage: findhardlinks <fileOrDirToFindFor> ..."
    exit 1
fi

while [[ $# -ge 1 ]] ; do
    echo "Processing '$1'"
    if [[ ! -r "$1" ]] ; then
        echo "   '$1' is not accessible"
    else
        numlinks=$(ls -ld "$1" | awk '{print $2}')
        inode=$(ls -id "$1" | awk '{print $1}' | head -1l)
        device=$(df "$1" | tail -1l | awk '{print $6}')
        echo "   '$1' has inode ${inode} on mount point '${device}'"
        find ${device} -inum ${inode} 2>/dev/null | sed 's/^/        /'
    fi
    shift
done

答案4

下面这个更简单的怎么样?(后者可能会取代上面的长脚本!)

如果你有一个特定的文件<THEFILENAME>,并且想要知道它在目录中的所有硬链接<TARGETDIR>(甚至可以是整个文件系统,用表示/

find <TARGETDIR> -type f -samefile  <THEFILENAME>

<SOURCEDIR>扩展逻辑,如果您想知道具有多个硬链接分布的所有文件<TARGETDIR>

find <SOURCEDIR> -type f -links +1   \
  -printf "\n\n %n HardLinks of file : %H/%f  \n"   \
  -exec find <TARGETDIR> -type f -samefile {} \; 

相关内容