dir / a命令显示给定位置中所有文件,文件夹的列表。但是它将显示连接点的类型以及指向文件夹的符号链接。是否有任何命令可以区分并告诉我其中哪些是连接点,哪些是符号链接以及哪些文件是硬链接?
dir / a命令显示给定位置中所有文件,文件夹的列表。但是它将显示连接点的类型以及指向文件夹的符号链接。是否有任何命令可以区分并告诉我其中哪些是连接点,哪些是符号链接以及哪些文件是硬链接?
Answers:
为什么不使用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
您不一定需要下载其他程序来列出结点,符号链接和硬链接,但是如果您有特定的输出格式要求,它们可能会有所帮助。
列出当前目录及其子目录中的所有联结,符号链接和符号链接目录:
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
从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\" } }"
dir 'd:\Temp' -recurse -force | ?{$_.LinkType -eq "Junction"} | select FullName,LinkType,Target
LinkType
对于重新解析点似乎不可靠。例如,在运行带有PS 5.1的W10的计算机上,LinkType
“ C:\ ProgramData \ Desktop”和“ C:\ Users \ All Users”均为null,而dir /aL
(命令提示符,不是PowerShell)指示第一个是连接点第二个是符号链接。
硬链接的描述如上所述,但是对于符号链接和交接点,以下工作很好:
我在这里没有使用任何新命令,但是它通过向您显示找到的每个链接的不错列表来改进了其中的一些命令,在路径中,它是类型(SymLink / Junction)以及链接路径和目标路径。
上面有一些不错的方法,但是它们只为您提供TARGET路径,通常您要删除链接(而不是目标),或删除所有链接和目标。
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"
Far Manager 3.0可以搜索和显示符号链接和连接点,使其与文件和目录不同。(它可以做很多其他事情。)它还可以搜索硬链接。
ALT+ F7=> [x]使用过滤器=>过滤er =>Ins
选择所需的属性。
LinkMagic2.exe(连接列表魔术)也很好。
c:\user
2年前我首次安装Windows 7时,我错误地删除了我的所有Junction链接,例如打印引擎盖,网络引擎盖和应用程序数据,因为我认为安装时将它们错误地放在了那里。它们真正的目的是向后兼容,并且在搜索Internet时,我发现有些人在没有这些连接点的情况下尝试执行某些操作时遇到了麻烦。