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


Answers:


18

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

从网站:

介绍

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

请阅读此Microsoft KB文章,以获取有关使用联结的提示。

请注意,Windows不支持与远程共享​​上目录的联结。

如果要查看重新解析信息,则Junction的用法如下:

使用结点

使用联结列出联结:

用法:[-s]

-s递归子目录

例子:

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

交界处c:\ test

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

结-sc:\

为“ c:\ Program Files”创建结点c:\ Program-Files:

C:> md程序文件

C:>交界处c:\ Program-Files“ c:\ Program Files”

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

结点-dc:\ Program-Files


1
“连接点”可以标识符号链接和连接点。谢谢。它不标识硬链接。什么命令将给我列出所有硬链接的文件/文件名。另外,还有什么方法可以获取文件的链接计数?我知道文件的链接数对应于它具有多少个硬链接。
Dhiwakar Ravikumar 2014年

2
您将必须对每个文件触发fsutil以检测硬链接serverfault.com/questions/319134/…–
Ganesh R.

49

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

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

dir /al /s

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

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

dir /al /s | findstr "<JUNCTION>"

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

dir /al /s | findstr "<SYMLINK>"

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

dir /al /s | findstr "<SYMLINKD>"

这里的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.

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

  • 使用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.       
  )
)

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

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

hlscan /dir %CD%

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

find . -links +1

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

使用Uwe Sieber的ListLinks程序-参见用法链接

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


在Windows 7中,dir / al / s不显示符号链接目录OP标记了Windows 7,因此无法回答OP问题。
jaylweb '16

@jaylweb(1)dir / al / s列出所有重新解析点。进一步查看我的答案,仅列出symlink目录。(2)您错了,这确实回答了问题。
Jimadine

11

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

dir 'd:\Temp' -recurse -force | ?{$_.LinkType} | select FullName,LinkType,Target

输出:

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}

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

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

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

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

PowerShell.exe -NoProfile -ExecutionPolicy Bypass -Command "<PowerShell commands>"

例如:

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

您如何更改它以仅显示路口?我对PowerShell命令不是很熟悉。
J. Scott Elblein

1
@ J.ScottElbleindir 'd:\Temp' -recurse -force | ?{$_.LinkType -eq "Junction"} | select FullName,LinkType,Target
Anton Krouglov

LinkType对于重新解析点似乎不可靠。例如,在运行带有PS 5.1的W10的计算机上,LinkType“ C:\ ProgramData \ Desktop”和“ C:\ Users \ All Users”均为null,而dir /aL(命令提示符,不是PowerShell)指示第一个是连接点第二个是符号链接。
NewSites

@NewSites您正在运行poweshell高架吗?
Anton Krouglov

是的,以管理员身份运行PS ISE。
NewSites

3

硬链接的描述如上所述,但是对于符号链接和交接点,以下工作很好:

我在这里没有使用任何新命令,但是它通过向您显示找到的每个链接的不错列表来改进了其中的一些命令,在路径中,它是类型(SymLink / Junction)以及链接路径和目标路径。

上面有一些不错的方法,但是它们只为您提供TARGET路径,通常您要删除链接(而不是目标),或删除所有链接和目标。

要获取类型,链接和目标,可以在CMD中使用以下内容:

FOR /F "Tokens=*" %A IN ('DIR /al /b /s G:\') DO @( for /F "Tokens=2,4 delims=<[]>" %B IN ('DIR /al "%~A"? ^| FIND /I " %~nA " ^| FIND /I "<" ^| FIND /I ">" ') DO @( ECHO.%~B: "%~A" → "%~C" ) )

输出示例:

SYMLINK: "G:\FTP\Root" → "G:\FTP\Data"
JUNCTION: "G:\FTP\Junctioned\BT\02" → "W:\FTPRoot\02"

1

Far Manager 3.0可以搜索和显示符号链接和连接点,使其与文件和目录不同。(它可以做很多其他事情。)它还可以搜索硬链接。

ALT+ F7=> [x]使用过滤器=>过滤er =>Ins

选择所需的属性。


0

LinkMagic2.exe(连接列表魔术)也很好。

c:\user2年前我首次安装Windows 7时,我错误地删除了我的所有Junction链接,例如打印引擎盖,网络引擎盖和应用程序数据,因为我认为安装时将它们错误地放在了那里。它们真正的目的是向后兼容,并且在搜索Internet时,我发现有些人在没有这些连接点的情况下尝试执行某些操作时遇到了麻烦。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.