如何使用目录查看文件夹中的所有符号链接、连接点、硬链接?

Dhi*_*mar 46 windows-7 symbolic-link dir ntfs-junction

命令dir /a显示给定位置中所有文件和文件夹的列表。但它显示连接点的类型以及文件夹的符号链接。是否有任何命令可以区分并告诉我哪些是连接点,哪些是符号链接以及哪些文件是硬链接?

Jim*_*ine 69

您不一定需要下载其他程序来列出连接、符号链接和硬链接,但如果您有特定的输出格式要求,它们可能会有所帮助。

列出当前目录及其子目录中的所有结点、符号链接和符号链接目录:

dir /al /s
Run Code Online (Sandbox Code Playgroud)

或者,如果您希望它们单独列出...

列出当前目录及其子目录中的所有结点:

dir /al /s | findstr "<JUNCTION>"
Run Code Online (Sandbox Code Playgroud)

列出当前目录及其子目录中的所有符号链接:

dir /al /s | findstr "<SYMLINK>"
Run Code Online (Sandbox Code Playgroud)

列出当前目录及其子目录中的所有符号链接目录:

dir /al /s | findstr "<SYMLINKD>"
Run Code Online (Sandbox Code Playgroud)

l属性标志为关键在这里; l用于Reparse Points(连接点、符号链接和符号链接目录)

硬链接

不幸的是,dir将硬链接列为普通文件,因此您无法使用它来识别硬链接。你可以使用内置的fsutil。它需要从提升的命令提示符运行。

使用fsutil,列出当前目录及其子目录中的所有硬链接:

for /F "usebackq tokens=2* delims=:" %G in (`forfiles /s /c "cmd /c fsutil hardlink list @path | findstr /n .* | findstr /b /v 1"`) do @fsutil hardlink list "%G" & echo.
Run Code Online (Sandbox Code Playgroud)

这种单线并不理想,我欢迎任何改进。

  • 使用forfiles与递归子目录选项(/s)锤打我的CPU,并采取了一些时间才能完成。
  • fsutil基本结束了运行两次; 第一次通过计算每次调用返回的输出行数来识别硬链接,第二次在刚找到的硬链接上获得正确的输出。
  • 会有重复的行。要消除它们,您需要将输出重定向到一个文件,然后通过类似uniq.

这是一个仅for用于识别硬链接的批处理文件。由于forfiles没有涉及,它可能会稍微快一点,但是它仍然受到上述单行的其余警告。

@echo off
AT > NUL
if %ERRORLEVEL% NEQ 0 echo You need to run this script from an elevated command prompt. Exiting. && exit /B 1

for /R "%CD%" %%a IN (*.*) do (
 for /F "usebackq tokens=2* delims=:" %%b in (`fsutil hardlink list "%%a" ^| findstr /n .* ^| findstr /b /v 1`) do (
    fsutil hardlink list "%%b"
    REM The following echo command breaks up each group of hard links with a blank line
    echo.       
  )
)
Run Code Online (Sandbox Code Playgroud)

还有一些其他(未经测试的)选项:

使用(旧)Microsoft HL Scan实用程序

hlscan /dir %CD%
Run Code Online (Sandbox Code Playgroud)

使用Microsoft 的 SFUA 实用工具包附带的替代find命令:

find . -links +1
Run Code Online (Sandbox Code Playgroud)

以与上述类似的方式使用 Sysinternals 的findlinks实用程序fsutil

使用 Uwe Sieber 的ListLinks程序 - 请参阅使用链接

如果您更喜欢 GUI 应用程序,请使用 Nirsoft 的NTFSLinksView


Gan*_* R. 23

为什么不使用SysInternals 中的junction.exe?它允许您列出特定文件夹或其子文件夹中的所有结点。

从网站:

介绍

Windows 2000 及更高版本支持目录符号链接,其中一个目录用作到计算机上另一个目录的符号链接。例如,如果目录 D:\SYMLINK 指定 C:\WINNT\SYSTEM32 作为其目标,那么访问 D:\SYMLINK\DRIVERS 的应用程序实际上将访问 C:\WINNT\SYSTEM32\DRIVERS。目录符号链接在 Windows 中称为 NTFS 连接。不幸的是,Windows 没有提供用于创建连接的工具——您必须购买 Win2K Resource Kit,它与用于创建连接的链接程序一起提供。因此,我决定编写自己的连接创建工具:Junction。Junction 不仅允许您创建 NTFS 连接,它还允许您查看文件或目录是否实际上是重新分析点。重解析点是 NTFS 连接所基于的机制,

请阅读这篇 Microsoft KB 文章,了解有关使用连接的提示。

请注意,Windows 不支持连接到远程共享上的目录。

如果要查看reparse信息,Junction的用法如下:

使用连接点

使用结点列出结点:

用法:[-s]

-s 递归子目录

例子:

要确定文件是否为联结,请指定文件名:

结 c:\test

要列出目录下的联结,请包括 –s 开关:

结-sc:\

要为“c:\Program Files”创建连接 c:\Program-Files:

C:>md 程序文件

C:>junction c:\Program-Files "c:\Program Files"

要删除结点,请使用 –d 开关:

连接 -dc:\Program-Files

  • 您必须在每个文件上触发 fsutil 以检测硬链接 http://serverfault.com/questions/319134/how-do-i-view-a-files-hard-links-in-windows (2认同)

Ant*_*lov 19

从 Powershell 5+ 开始,以下单行递归列出所有文件硬链接、目录连接和符号链接及其从d:\Temp\以下位置开始的目标:

dir 'd:\Temp' -recurse -force | ?{$_.LinkType} | select FullName,LinkType,Target
Run Code Online (Sandbox Code Playgroud)

输出:

FullName                                LinkType     Target
--------                                --------     ------
D:\Temp\MyJunctionDir                   Junction     {D:\exp\junction_target_dir}
D:\Temp\MySymLinkDir                    SymbolicLink {D:\exp\symlink_target_dir}
D:\Temp\MyHardLinkFile.txt              HardLink     {D:\temp\MyHardLinkFile2.txt, D:\exp\hlink_target.xml}
D:\Temp\MyHardLinkFile2.txt             HardLink     {D:\temp\MyHardLinkFile.txt, D:\exp\hlink_target.xml}
D:\Temp\MySymLinkFile.txt               SymbolicLink {..\exp\symlink_target.xml}
D:\Temp\MySymLinkDir\MySymLinkFile2.txt SymbolicLink {D:\temp\normal file.txt}
Run Code Online (Sandbox Code Playgroud)

如果您关心硬链接的多个目标,请使用此变体,其中以制表符分隔列出目标:

dir 'd:\Temp' -recurse -force | ?{$_.LinkType} | select FullName,LinkType,@{ Name="Targets"; Expression={$_.Target -join "`t"} }
Run Code Online (Sandbox Code Playgroud)

您可能需要管理员权限才能在 say 上运行此脚本C:\

要从传统命令行 (cmd.exe) 运行这些脚本:

PowerShell.exe -NoProfile -ExecutionPolicy Bypass -Command "<PowerShell commands>"
Run Code Online (Sandbox Code Playgroud)

例如:

C:\>PowerShell.exe -NoProfile -ExecutionPolicy Bypass -Command "dir 'd:\Temp' -recurse -force | ?{ $_.LinkType } | select FullName, LinkType, @{ Name = \"Targets\"; Expression = { $_.Target -join \"`t\" } }"
Run Code Online (Sandbox Code Playgroud)

  • 对于重分析点,“LinkType”似乎并不可靠。例如,在我的运行 W10 和 PS 5.1 的计算机上,“C:\ProgramData\Desktop”和“C:\Users\All Users”的“LinkType”均为空,而“dir /aL”(命令提示符,而不是 PowerShell) ) 表示第一个是连接点,第二个是符号链接。 (3认同)