Come visualizzare tutti i collegamenti simbolici, i punti di giunzione, i collegamenti reali in una cartella usando dir?


30

Il comando dir / a visualizza un elenco di tutti i file e cartelle in una determinata posizione. Ma mostra il tipo di punti di giunzione e collegamenti simbolici alle cartelle. Esiste un comando che possa differenziare e dirmi quali di questi sono punti di giunzione e quali sono collegamenti simbolici e quali file sono collegamenti reali?

Risposte:


18

Perché non utilizzare junction.exe da SysInternals? Ti permette di elencare tutti gli incroci in una particolare cartella o nelle sue sottocartelle.

Dal sito Web:

introduzione

Windows 2000 e versioni successive supportano collegamenti simbolici di directory, in cui una directory funge da collegamento simbolico a un'altra directory sul computer. Ad esempio, se la directory D: \ SYMLINK specificava come destinazione C: \ WINNT \ SYSTEM32, un'applicazione che accedeva a D: \ SYMLINK \ DRIVERS avrebbe in realtà accesso a C: \ WINNT \ SYSTEM32 \ DRIVERS. I collegamenti simbolici alla directory sono noti come giunzioni NTFS in Windows. Sfortunatamente, Windows non dispone di strumenti per la creazione di giunzioni: è necessario acquistare il Resource Kit Win2K, fornito con il programma linkd per la creazione di giunzioni. Ho quindi deciso di scrivere il mio strumento per la creazione di giunzioni: Junction. Junction non solo consente di creare giunzioni NTFS, ma consente di vedere se i file o le directory sono effettivamente punti di analisi. I punti di analisi sono il meccanismo su cui si basano le giunzioni NTFS,

Leggere questo articolo di Microsoft KB per suggerimenti sull'utilizzo delle giunzioni.

Notare che Windows non supporta le giunzioni alle directory su condivisioni remote.

Se si desidera visualizzare le informazioni di analisi, l'utilizzo di Junction è il seguente:

Utilizzando Junction

Utilizzare la giunzione per elencare le giunzioni:

Utilizzo: [-s]

-s Sottodirectory Recurse

Esempi:

Per determinare se un file è un nodo, specificare il nome del file:

giunzione c: \ test

Per elencare le giunzioni sotto una directory, includere l'opzione –s:

giunzione -sc: \

Per creare un incrocio c: \ Programmi-File per "c: \ Programmi":

C:> md Programmi-Files

C:> giunzione c: \ Programmi "c: \ Programmi"

Per eliminare un incrocio, utilizzare l'opzione –d:

junction -dc: \ Programmi-Files


1
"giunzione" può identificare collegamenti simbolici e punti di giunzione. Grazie. Non identifica i collegamenti reali. Quale comando mi darà un elenco di tutti i file / nomi di file che sono hard link. In alternativa, esiste un modo per ottenere il conteggio dei collegamenti di un file? So che il conteggio dei collegamenti di un file corrisponde a quanti collegamenti fisici ha.
Dhiwakar Ravikumar,

2
Dovrai sparare fsutil su ogni file per rilevare hardlink serverfault.com/questions/319134/…
Ganesh R.

49

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 lflag dell'attributo è la chiave qui; lè per Reparse Points(giunzioni, collegamenti simbolici e directory symlink)

Collegamenti reali

Sfortunatamente direlenca i collegamenti fisici come file normali, quindi non è possibile utilizzarlo per identificare i collegamenti fisici. Puoi usare fsutilinvece 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 forfilescon l'opzione delle sottodirectory recurse ( /s) ha martellato la mia CPU e ha richiesto del tempo per il completamento.
  • I fsutilfondamentalmente 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 forper identificare i collegamenti reali. Dato che forfilesnon è 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 fsutilsopra menzionato

Usa il programma ListLinks di Uwe Sieber - vedi il link per l'uso

Utilizzare NTFSLinksView di Nirsoft se si preferisce un'applicazione GUI


In Windows 7, dir / al / s non mostra una directory symlink L'OP ha taggato Windows 7, quindi questo non risponde alla domanda OP.
jaylweb,

@jaylweb (1) dir / al / s elenca tutti i punti di analisi. Vedi più in basso la mia risposta per elencare solo le directory dei link simbolici. (2) Ti sbagli, questo risponde alla domanda.
Jimadine,

11

A partire da Powershell 5+ il seguente one-liner elenca in modo ricorsivo tutti gli hardlink dei file, le giunzioni delle directory e i collegamenti simbolici e i loro target a partire da d:\Temp\:

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

Produzione:

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}

Se ti interessano più target per hardlink, usa questa variante che elenca target separati da tabulazione:

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

Potresti aver bisogno dei privilegi di amministratore per eseguire questo script su dire C:\.

Per eseguire questi script dalla tradizionale riga di comando (cmd.exe):

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

Per esempio:

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

Come si modifica questo per mostrare solo le giunzioni? Non ho molta familiarità con i comandi di PowerShell.
J. Scott Elblein,

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

LinkTypenon sembra essere affidabile per i punti di analisi. Ad esempio, sul mio computer che esegue W10 con PS 5.1, LinkTypeè nullo sia per "C: \ ProgramData \ Desktop" che "C: \ Users \ All Users", mentre dir /aL(Prompt dei comandi, non PowerShell) indica che il primo è un punto di giunzione e il secondo un collegamento simbolico.
NewSites,

@NewSites stai eseguendo Poweshell elevato?
Anton Krouglov,

Sì, eseguendo PS ISE come amministratore.
NewSites,

3

I collegamenti reali sono meglio descritti come sopra, ma per i collegamenti simbolici e le giunzioni funzionano bene:

Non sto usando alcun nuovo comando qui, tuttavia migliora alcuni elencati mostrando un bel elenco di ogni collegamento trovato, nel percorso, è il tipo (SymLink / Junction) e sia il percorso del collegamento che il percorso di destinazione.

Ce ne sono alcuni buoni sopra ma ti danno solo il percorso TARGET e di solito vuoi eliminare il collegamento e non la destinazione o correlare tutti i collegamenti e le destinazioni.

Per ottenere il tipo, il collegamento e la destinazione, è possibile utilizzare quanto segue in 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" ) )

Esempio di output:

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

1

Far Manager 3.0 può sia cercare che visualizzare collegamenti simbolici e punti di giunzione diversi da file e directory. (Può fare tante altre cose.) Può anche cercare collegamenti reali.

ALT+ F7=> [x] Usa filtro => Filt er =>Ins

Scegli gli attributi che desideri.


0

Anche LinkMagic2.exe (magico elenco di giunzione) è buono.

Ho erroneamente cancellato tutti i miei c:\usercollegamenti Junction, come i dati di printhood, nethood e dell'applicazione quando ho installato Windows 7 per la prima volta 2 anni fa perché pensavo che fossero stati inseriti erroneamente dall'installazione. Quello a cui servono veramente è la retrocompatibilità, e mentre cerco su Internet vedo che alcuni si sono messi nei guai cercando di fare certe cose senza questi punti di congiunzione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.