Wie kann ich alle symbolischen Links, Kreuzungspunkte und festen Links in einem Ordner mit dir anzeigen?

30

Der Befehl dir / a zeigt eine Liste aller Dateien und Ordner an einem bestimmten Ort an. Es zeigt jedoch den Typ für Kreuzungspunkte sowie symbolische Verknüpfungen zu Ordnern an. Gibt es einen Befehl, der unterscheidet und mir sagt, welche dieser Knotenpunkte und welche symbolischen Links sowie welche der Dateien feste Links sind?

Dhiwakar Ravikumar
quelle

Antworten:

18

Warum nicht junction.exe von SysInternals verwenden? Hier können Sie alle Junctions in einem bestimmten Ordner oder seinen Unterordnern auflisten.

Von der Website:

Einführung

Windows 2000 und höher unterstützt symbolische Verzeichnisverknüpfungen, wobei ein Verzeichnis als symbolische Verknüpfung zu einem anderen Verzeichnis auf dem Computer dient. Wenn das Verzeichnis D: \ SYMLINK beispielsweise C: \ WINNT \ SYSTEM32 als Ziel angibt, greift eine Anwendung, die auf D: \ SYMLINK \ DRIVERS zugreift, in Wirklichkeit auf C: \ WINNT \ SYSTEM32 \ DRIVERS zu. Verzeichnissymbolverknüpfungen werden in Windows als NTFS-Junctions bezeichnet. Leider wird Windows ohne Tools zum Erstellen von Junctions ausgeliefert. Sie müssen das Win2K Resource Kit erwerben, das mit dem Programm linkd zum Erstellen von Junctions geliefert wird. Ich habe mich daher entschlossen, mein eigenes Werkzeug zum Erstellen von Junctions zu schreiben: Junction. Mit Junction können Sie nicht nur NTFS-Junctions erstellen, sondern auch feststellen, ob es sich bei Dateien oder Verzeichnissen tatsächlich um Analysepunkte handelt. Analysepunkte sind der Mechanismus, auf dem NTFS-Junctions basieren.

In diesem Microsoft KB-Artikel finden Sie Tipps zur Verwendung von Junctions.

Beachten Sie, dass Windows keine Junctions zu Verzeichnissen auf Remotefreigaben unterstützt.

Wenn Sie die Analyseinformationen anzeigen möchten, wird für Junction Folgendes verwendet:

Junction verwenden

Verwenden Sie Junction, um Junctions aufzulisten:

Verwendung: [-s]

-s Recurse-Unterverzeichnisse

Beispiele:

Geben Sie den Dateinamen an, um festzustellen, ob es sich bei einer Datei um eine Junction handelt:

Kreuzung c: \ test

Um Junctions unter einem Verzeichnis aufzulisten, geben Sie den Schalter –s ein:

Kreuzung -sc: \

So erstellen Sie eine Junction c: \ Programme für "c: \ Programme":

C:> md Program-Files

C:> Junction c: \ Programme "c: \ Programme"

Verwenden Sie den Schalter –d, um eine Junction zu löschen:

Junction -dc: \ Programme

Ganesh R.
quelle
1
"Junction" kann symbolische Links und Junction Points identifizieren. Vielen Dank. Es werden keine harten Links identifiziert. Welcher Befehl gibt mir eine Liste aller Dateien / Dateinamen, die fest verknüpft sind. Alternativ gibt es eine Möglichkeit, die Linkanzahl einer Datei zu ermitteln? Ich weiß, dass die Anzahl der Links einer Datei der Anzahl der festen Links entspricht.
Dhiwakar Ravikumar
2
Sie müssen fsutil über jede Datei auslösen
Ganesh R.
49

Sie müssen nicht unbedingt zusätzliche Programme herunterladen, um Junctions, Symlinks und Hardlinks aufzulisten. Wenn Sie jedoch bestimmte Anforderungen an das Ausgabeformat haben, können diese hilfreich sein.

Listen Sie alle Junctions, Symlinks und Symlink-Verzeichnisse im aktuellen Verzeichnis und seinen Unterverzeichnissen auf:

dir /al /s

Oder wenn Sie möchten, dass sie separat aufgeführt werden ...

Listen Sie alle Junctions im aktuellen Verzeichnis und seinen Unterverzeichnissen auf:

dir /al /s | findstr "<JUNCTION>"

Listen Sie alle Symlinks im aktuellen Verzeichnis und seinen Unterverzeichnissen auf:

dir /al /s | findstr "<SYMLINK>"

Listen Sie alle Symlink-Verzeichnisse im aktuellen Verzeichnis und seinen Unterverzeichnissen auf:

dir /al /s | findstr "<SYMLINKD>"

Das lAttribut-Flag ist hier der Schlüssel. list für Reparse Points(Junctions, Symlinks und Symlink-Verzeichnisse)

Harte Verbindungen

dirListet Hardlinks leider als normale Dateien auf, sodass Sie sie nicht zur Identifizierung von Hardlinks verwenden können. Sie können fsutilstattdessen den eingebauten verwenden. Es muss an einer Eingabeaufforderung mit erhöhten Rechten ausgeführt werden.

Mit fsutilallen Hard - Links im aktuellen Verzeichnis und dessen Unterverzeichnissen, die Liste:

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.

Dieser Einzeiler ist nicht ideal und ich würde Verbesserungen begrüßen.

  • Die Verwendung von forfiles( /s) mit der Option "recurse subdirectories" schlug auf meine CPU ein und es dauerte eine Weile, bis der Vorgang abgeschlossen war.
  • Das fsutilendet im Grunde zweimal ausgeführt; Das erste Mal, um die Hardlinks durch Zählen der Anzahl der von jedem Aufruf zurückgegebenen Ausgabezeilen zu identifizieren, und das zweite Mal, um bei gerade gefundenen Hardlinks die Ausgabe richtig zu machen.
  • Es wird doppelte Zeilen geben. Um sie zu beseitigen, sollten Sie die Ausgabe in eine Datei umleiten und die Datei dann mit einem Tool wie dem folgenden ausführen uniq.

Hier ist eine Batch-Datei, die nur forzum Identifizieren von Hardlinks verwendet wird. Da forfileses nicht involviert ist, kann es etwas schneller sein, es leidet jedoch immer noch an den verbleibenden Vorbehalten des obigen Einzeilers.

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

Es gibt einige andere (nicht getestete) Optionen:

Verwenden Sie das (alte) Microsoft HL Scan- Dienstprogramm

hlscan /dir %CD%

Verwenden Sie den alternativen Befehl find , der mit dem SFUA-Dienstprogramm-Toolkit von Microsoft geliefert wird:

find . -links +1

Verwenden Sie das Dienstprogramm findlinks von Sysinternals auf ähnliche Weise wie fsutiloben beschrieben

Verwenden Sie das ListLinks- Programm von Uwe Sieber - siehe Link für die Verwendung

Verwenden Sie NTFSLinksView von Nirsoft, wenn Sie eine GUI-Anwendung bevorzugen

Jimadine
quelle
In Windows 7 zeigt dir / al / s kein Symlink-Verzeichnis an. Das OP hat Windows 7 markiert, daher wird die Frage des OP nicht beantwortet.
Jaylweb
@jaylweb (1) dir / al / s listet alle Analysepunkte auf. Weitere Informationen zum Auflisten von Symlink-Verzeichnissen finden Sie weiter unten in meiner Antwort. (2) Du liegst falsch, das beantwortet die Frage.
Jimadine
11

Ab Powershell 5+ listet der folgende Einzeiler rekursiv alle Datei-Hardlinks, Verzeichnisknoten und symbolischen Links sowie deren Ziele auf, beginnend mit d:\Temp\:

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

Ausgabe:

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}

Wenn Sie mehrere Ziele für Hardlinks bevorzugen, verwenden Sie diese Variante, in der die Ziele durch Tabulatoren getrennt aufgeführt sind:

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

Möglicherweise benötigen Sie Administratorrechte, um dieses Skript auszuführen C:\.

So führen Sie diese Skripte über die herkömmliche Befehlszeile (cmd.exe) aus:

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

Zum Beispiel:

C:\>PowerShell.exe -NoProfile -ExecutionPolicy Bypass -Command "dir 'd:\Temp' -recurse -force | ?{ $_.LinkType } | select FullName, LinkType, @{ Name = \"Targets\"; Expression = { $_.Target -join \"`t\" } }"
Anton Krouglov
quelle
Wie können Sie dies ändern, um nur Junctions anzuzeigen? Ich bin mit PowerShell-Befehlen nicht wirklich vertraut.
J. Scott Elblein
1
@ J.ScottElbleindir 'd:\Temp' -recurse -force | ?{$_.LinkType -eq "Junction"} | select FullName,LinkType,Target
Anton Krouglov
LinkTypescheint für Analysepunkte nicht zuverlässig zu sein. Zum Beispiel auf meinem Computer läuft W10 mit PS 5.1, LinkTypeist null für beide „C: \ Programdata \ Desktop“ und „C: \ Users \ All Users“, während dir /aL(Eingabeaufforderung, nicht Powershell) zeigt die ersten ein Verbindungspunkt ist und der zweite eine symbolische Verbindung.
NewSites
@NewSites Laufen Sie Poweshell erhöht?
Anton Krouglov
Ja, PS ISE als Administrator ausführen.
NewSites
3

Harte Links werden wie oben beschrieben besser beschrieben, aber für symbolische Links und Junctions funktioniert Folgendes gut:

Ich verwende hier keine neuen Befehle, jedoch werden einige der aufgelisteten Befehle verbessert, indem eine schöne Liste aller gefundenen Links angezeigt wird, und zwar im Pfad, im Typ (SymLink / Junction) und sowohl im Linkpfad als auch im Zielpfad.

Es gibt einige gute oben, aber sie geben nur den ZIEL-Pfad an, und normalerweise möchten Sie den Link und nicht das Ziel löschen oder alle Links und Ziele korrelieren.

Um den Typ, den Link und das Ziel zu erhalten, können Sie in CMD Folgendes verwenden:

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

Beispielausgabe:

SYMLINK: "G:\FTP\Root" → "G:\FTP\Data"
JUNCTION: "G:\FTP\Junctioned\BT\02" → "W:\FTPRoot\02"
Ben Personick
quelle
1

Far Manager 3.0 kann Symlinks und Knotenpunkte suchen und anzeigen, die sich von Dateien und Verzeichnissen unterscheiden. (Es kann so viele andere Dinge tun.) Es kann auch nach harten Links suchen.

ALT+ F7=> [x] Verwende filter => Filt er =>Ins

Wählen Sie die gewünschten Attribute.

user3603546
quelle
0

LinkMagic2.exe (Junction List Magic) ist auch gut.

Ich habe versehentlich alle meine c:\userJunction-Links, wie Druck-, Netzwerk- und Anwendungsdaten, gelöscht, als ich Windows 7 vor 2 Jahren zum ersten Mal installiert habe, weil ich dachte, sie wurden bei der Installation versehentlich dort abgelegt. Was sie wirklich sind, ist die Abwärtskompatibilität, und während ich im Internet suche, stoßen einige auf Probleme, wenn sie versuchen, bestimmte Dinge ohne diese Knotenpunkte zu tun.

Jim
quelle