我跑
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 {} \;