Você não precisa necessariamente baixar programas adicionais para listar junções, links simbólicos e links físicos, mas se você tiver requisitos específicos de formato de saída, eles podem ajudar.
Liste todas as junções, links simbólicos e diretórios de links simbólicos no diretório atual e seus subdiretórios:
dir /al /s
Ou se você quiser que eles sejam listados separadamente ...
Liste todas as junções no diretório atual e seus subdiretórios:
dir /al /s | findstr "<JUNCTION>"
Liste todos os links simbólicos no diretório atual e seus subdiretórios:
dir /al /s | findstr "<SYMLINK>"
Liste todos os diretórios de link simbólico no diretório atual e seus subdiretórios:
dir /al /s | findstr "<SYMLINKD>"
O l
sinalizador de atributo é a chave aqui; l
é para Reparse Points
(junções, links simbólicos e diretórios de links simbólicos)
Links físicos
Infelizmente, dir
lista os links físicos como arquivos normais; portanto, você não pode usá-lo para identificar os links físicos. Você pode usar o embutido fsutil
. Ele precisa ser executado em um prompt de comando elevado.
Com fsutil
, liste todos os links físicos no diretório atual e seus subdiretórios:
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.
Este one-liner não é o ideal, e eu gostaria de receber quaisquer melhorias.
- Usar
forfiles
com a opção de subdiretórios recurse ( /s
) martelou minha CPU e demorou um pouco para ser concluído.
- O
fsutil
basicamente acaba rodando duas vezes; a primeira vez para identificar os links físicos contando o número de linhas de saída retornadas por cada chamada e a segunda vez nos links físicos recém-encontrados para obter a saída correta.
- Haverá linhas duplicadas. Para eliminá-los, você deseja redirecionar a saída para um arquivo e depois executá-lo através de uma ferramenta como a
uniq
.
Aqui está um arquivo em lotes usado apenas for
para identificar links físicos. Como forfiles
não está envolvido, pode ser um pouco mais rápido, no entanto, ainda sofre as ressalvas restantes da linha única acima.
@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.
)
)
Existem algumas outras opções (não testadas):
Use o utilitário Microsoft HL Scan (antigo)
hlscan /dir %CD%
Use o comando find alternativo que acompanha o kit de ferramentas do utilitário SFUA da Microsoft:
find . -links +1
Use o utilitário findlinks da Sysinternals de maneira semelhante à fsutil
mencionada acima
Use o programa ListLinks de Uwe Sieber - veja o link para uso
Use o NTFSLinksView da Nirsoft se você preferir um aplicativo GUI