Non è necessario scaricare programmi aggiuntivi per elencare giunzioni, collegamenti simbolici e collegamenti reali, ma se si dispone di requisiti specifici per il formato di output, potrebbero essere di aiuto.
Elenca tutte le giunzioni, i collegamenti simbolici e le directory dei collegamenti simbolici nella directory corrente e nelle sue sottodirectory:
dir /al /s
O se li vuoi elencati separatamente ...
Elenca tutte le giunzioni nella directory corrente e nelle sue sottodirectory:
dir /al /s | findstr "<JUNCTION>"
Elenca tutti i collegamenti simbolici nella directory corrente e nelle sue sottodirectory:
dir /al /s | findstr "<SYMLINK>"
Elenca tutte le directory dei link simbolici nella directory corrente e nelle sue sottodirectory:
dir /al /s | findstr "<SYMLINKD>"
Il l
flag dell'attributo è la chiave qui; l
è per Reparse Points
(giunzioni, collegamenti simbolici e directory symlink)
Collegamenti reali
Sfortunatamente dir
elenca i collegamenti fisici come file normali, quindi non è possibile utilizzarlo per identificare i collegamenti fisici. Puoi usare fsutil
invece l'integrato . Deve essere eseguito da un prompt dei comandi con privilegi elevati.
Con fsutil
, elenca tutti i collegamenti reali nella directory corrente e nelle sue sottodirectory:
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.
Questo one-liner non è l'ideale e gradirei qualsiasi miglioramento.
- L'utilizzo
forfiles
con l'opzione delle sottodirectory recurse ( /s
) ha martellato la mia CPU e ha richiesto del tempo per il completamento.
- I
fsutil
fondamentalmente finisce per correre due volte; la prima volta per identificare gli hard link contando il numero di linee di output restituite da ciascuna chiamata e la seconda volta su hard link appena trovati per ottenere l'output corretto.
- Ci saranno righe duplicate. Per eliminarli dovresti reindirizzare l'output su un file e quindi eseguire il file tramite uno strumento come
uniq
.
Ecco un file batch che utilizza solo for
per identificare i collegamenti reali. Dato che forfiles
non è coinvolto, può essere leggermente più veloce, tuttavia soffre ancora delle avvertenze rimanenti del sopra uno strato.
@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.
)
)
Esistono alcune altre opzioni (non testate):
Utilizzare la (vecchia) utility Microsoft HL Scan
hlscan /dir %CD%
Utilizzare il comando di ricerca alternativo fornito con il toolkit di utilità SFUA di Microsoft:
find . -links +1
Utilizzare l' utilità di ricerca dei collegamenti di Sysinternals in un modo simile a quello fsutil
sopra menzionato
Usa il programma ListLinks di Uwe Sieber - vedi il link per l'uso
Utilizzare NTFSLinksView di Nirsoft se si preferisce un'applicazione GUI