如何找到文件/文件夹(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:取决于使用的文件系统,FindFirstFileName
和 FindNextFileName
可能有用,但如前所述,它们并不总是有效(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)的所有硬链接和符号链接?的主要内容,如果未能解决你的问题,请参考以下文章
如何把windows和unix格式混合的文件a.tex,变得都是unix格式
您的系统中有一个文件包含单词“UnixCommandInterviewQuestions”如何在Unix中找到该文件?[重复]