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
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)