如何找到文件/文件夹(Windows 和 UNIX)的所有硬链接和符号链接?

Posted

技术标签:

【中文标题】如何找到文件/文件夹(Windows 和 UNIX)的所有硬链接和符号链接?【英文标题】:How to find all the hard and symbolic links to a file/folder (Windows and UNIX)? 【发布时间】:2015-07-01 16:54:54 【问题描述】:

如何在 Windows 中找到指向文件/文件夹的所有硬链接和符号链接(使用标准操作系统功能)?

什么是反对 UNIX 的?

【问题讨论】:

【参考方案1】:

来自这个不错的 linux 教程:

https://jackal.livejournal.com/2164247.html

获取inode号:

ls -i FILENAME

按inode编号按文件查找:

find / -inum INODE-NUM-FROM-ABOVE

请随意限制find 以加快搜索速度。

例子:

> ls -i myfile.csv 
74714625 myfile.csv

> find ~/myfolder/ -inum 74714625
/home/me/myfolder/myfile.csv
/home/me/myfolder/another/path/another_filename_with_same_inode.csv

【讨论】:

【参考方案2】:

符号链接:

您必须搜索所有硬盘等上的所有文件。并分别检查它们中的每一个。否则无法获取特定文件的符号链接列表。

对于 Linux,How do you determine using stat() whether a file is a symbolic link? 可能会有所帮助。

对于 Windows ......好吧,重解析点无法用一行来解释。 检查文件是否是来自 C++ 的符号链接并非易事。

硬链接:

Linux:再次(通常)不搜索所有文件并检查 inode 号是不可能的。

Windows:取决于使用的文件系统,FindFirstFileNameFindNextFileName 可能有用,但如前所述,它们并不总是有效(ReFS...)

【讨论】:

在 Windows 上,符号链接是通过重解析点实现的,可以通过 FILE_ATTRIBUTE_REPARSE_POINT 属性由 GetFileAttributes()FindFirstFile()/FindNextFile() 检测到。硬链接也必须是可检测的(我不确定如何),因为命令行fsutil 工具有一个hardlink list 参数,可以找到给定文件的硬链接(至少在Win7/2008+ 上)和SysInternals 还有一个FindLinks 工具用于查找硬链接。 @RemyLebeau 我忘了FILE_ATTRIBUTE_REPARSE_POINT (facepalm)。但是,检查它是符号链接还是其他类型的 RP 并不容易。是的,硬链接是可以检测到的,如答案中所述,但仅限于某些文件系统(NTFS 是的,ReFS 不是所有版本......) 实际上,当文件/文件夹上存在FILE_ATTRIBUTE_REPARSE_POINT 属性时,来自FindFirstFile()/FindNextFile()WIN32_FIND_DATA 结构在dwReserved0 字段中指定Reparse Point Tag。可用标签之一是IO_REPARSE_TAG_SYMLINK。这是documented:“您可以通过测试标记值是否为 IO_REPARSE_TAG_SYMLINK 来确定重解析点是否为符号链接。” FindFirstFileNameW/FindNextFileNameW 应该适用于所有支持硬链接的标准本地文件系统。就硬链接而言,这可能就是您所需要的。

以上是关于如何找到文件/文件夹(Windows 和 UNIX)的所有硬链接和符号链接?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用-cp在unix上编译java

如何把windows和unix格式混合的文件a.tex,变得都是unix格式

您的系统中有一个文件包含单词“UnixCommandInterviewQuestions”如何在Unix中找到该文件?[重复]

如何将linux格式文件转成windows可认文件

UNIX Laravel Artisan文件权限

如何在 unix 上找到没有日志文件的死进程的原因?