Comment afficher tous les liens symboliques, les points de jonction, les liens matériels dans un dossier en utilisant dir?

30

La commande dir / a affiche une liste de tous les fichiers, dossiers dans un emplacement donné. Mais il affiche le type des points de jonction ainsi que des liens symboliques vers les dossiers. Existe-t-il une commande qui différenciera et me dira quels sont ces points de jonction et quels sont les liens symboliques ainsi que les fichiers qui sont des liens durs?

Dhiwakar Ravikumar
la source

Réponses:

18

Pourquoi ne pas utiliser junction.exe de SysInternals? Il vous permet de répertorier toutes les jonctions dans un dossier particulier ou ses sous-dossiers.

Depuis le site Web:

introduction

Windows 2000 et versions ultérieures prennent en charge les liens symboliques de répertoire, où un répertoire sert de lien symbolique vers un autre répertoire de l'ordinateur. Par exemple, si le répertoire D: \ SYMLINK spécifiait C: \ WINNT \ SYSTEM32 comme cible, une application accédant à D: \ SYMLINK \ DRIVERS accéderait en réalité à C: \ WINNT \ SYSTEM32 \ DRIVERS. Les liens symboliques d'annuaire sont appelés jonctions NTFS dans Windows. Malheureusement, Windows n'est livré avec aucun outil pour créer des jonctions - vous devez acheter le Kit de ressources Win2K, qui est fourni avec le programme linkd pour créer des jonctions. J'ai donc décidé d'écrire mon propre outil de création de jonction: Junction. La jonction vous permet non seulement de créer des jonctions NTFS, elle vous permet de voir si les fichiers ou les répertoires sont réellement des points d'analyse. Les points d’élimination sont le mécanisme sur lequel les jonctions NTFS sont basées,

Veuillez lire cet article Microsoft KB pour obtenir des conseils sur l'utilisation des jonctions.

Notez que Windows ne prend pas en charge les jonctions vers des répertoires sur des partages distants.

Si vous souhaitez afficher les informations d'analyse, l'utilisation de Junction est la suivante:

Utilisation de la jonction

Utilisez la jonction pour répertorier les jonctions:

Coutumes]

-s Sous-répertoires Recurse

Exemples:

Pour déterminer si un fichier est une jonction, spécifiez le nom du fichier:

jonction c: \ test

Pour répertorier les jonctions sous un répertoire, incluez le commutateur –s:

jonction -sc: \

Pour créer une jonction c: \ Program-Files pour "c: \ Program Files":

C:> md Program-Files

C:> jonction c: \ Program-Files "c: \ Program Files"

Pour supprimer une jonction, utilisez le commutateur –d:

junction -dc: \ Program-Files

Ganesh R.
la source
1
"jonction" peut identifier les liens symboliques et les points de jonction. Merci. Il n'identifie pas les liens durs. Quelle commande me donnera une liste de tous les fichiers / noms de fichiers liés en dur. Est-il également possible d'obtenir le nombre de liens d'un fichier? Je sais que le nombre de liens d'un fichier correspond au nombre de liens durs qu'il contient.
Dhiwakar Ravikumar
2
Vous devrez lancer fsutil sur chaque fichier pour détecter les liens durs serverfault.com/questions/319134/…
Ganesh R.
49

Vous n'avez pas nécessairement besoin de télécharger des programmes supplémentaires pour répertorier les jonctions, les liens symboliques et les liens matériels, mais si vous avez des exigences de format de sortie spécifiques, ils peuvent vous aider.

Répertoriez toutes les jonctions, les liens symboliques et les répertoires de liens symboliques dans le répertoire actuel et ses sous-répertoires:

dir /al /s

Ou si vous voulez qu'ils soient listés séparément ...

Liste toutes les jonctions dans le répertoire courant et ses sous-répertoires:

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

Liste tous les liens symboliques dans le répertoire courant et ses sous-répertoires:

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

Liste tous les répertoires de liens symboliques dans le répertoire courant et ses sous-répertoires:

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

Le ldrapeau d'attribut est clé ici; lest pour Reparse Points(jonctions, liens symboliques et répertoires de liens symboliques)

Liens durs

Malheureusement, dirrépertorie les liens durs en tant que fichiers normaux, vous ne pouvez donc pas les utiliser pour identifier les liens durs. Vous pouvez utiliser le intégré à la fsutilplace. Il doit être exécuté à partir d'une invite de commandes élevée.

Avec fsutil, listez tous les liens durs dans le répertoire courant et ses sous-répertoires:

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.

Ce one-liner n'est pas idéal et j'accueillerais toute amélioration.

  • L'utilisation forfilesde l'option ( /s) des sous-répertoires recurse a martelé mon processeur et a pris du temps.
  • Le fsutilprincipe finit par fonctionner deux fois; la première fois pour identifier les liaisons matérielles en comptant le nombre de lignes de sortie renvoyées par chaque appel, et la deuxième fois sur les liaisons matérielles qui viennent d'être trouvées pour obtenir la sortie correcte.
  • Il y aura des lignes en double. Pour les éliminer, vous souhaitez rediriger la sortie vers un fichier, puis exécuter le fichier via un outil comme uniq.

Voici un fichier batch qui utilise juste forpour identifier les liens durs. Comme il forfilesn'est pas impliqué, il peut être légèrement plus rapide, mais il souffre toujours des mises en garde restantes de la doublure ci-dessus.

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

Il existe quelques autres options (non testées):

Utilisez l’ancien utilitaire Microsoft HL Scan

hlscan /dir %CD%

Utilisez la commande alternative find fournie avec la boîte à outils de l'utilitaire SFUA de Microsoft:

find . -links +1

Utilisez l' utilitaire findlinks de Sysinternals d' une manière similaire à celle fsutilmentionnée ci-dessus

Utilisez le programme ListLinks d' Uwe Sieber - voir le lien pour l'utilisation

Utilisez NTFSLinksView de Nirsoft si vous préférez une application graphique

Jimadine
la source
Dans Windows 7, dir / al / s n'affiche pas de répertoire de liens symboliques. L'OP étiqueté Windows 7, donc cela ne répond pas à la question OPs.
jaylweb
@jaylweb (1) dir / al / s répertorie tous les points d'analyse. Voir plus bas ma réponse pour lister les répertoires de liens symboliques uniquement. (2) Vous vous trompez, cela répond à la question.
Jimadine
11

À partir de Powershell 5+, le one-liner suivant répertorie récursivement tous les liens physiques de fichiers, les jonctions de répertoires et les liens symboliques et leurs cibles à partir de d:\Temp\:

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

Sortie:

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}

Si vous vous souciez de plusieurs cibles pour les liens physiques, utilisez cette variante qui répertorie les cibles séparées par des tabulations:

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

Vous pouvez avoir besoin de privilèges d'administrateur pour exécuter ce script, disons C:\.

Pour exécuter ces scripts à partir de la ligne de commande traditionnelle (cmd.exe):

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

Par exemple:

C:\>PowerShell.exe -NoProfile -ExecutionPolicy Bypass -Command "dir 'd:\Temp' -recurse -force | ?{ $_.LinkType } | select FullName, LinkType, @{ Name = \"Targets\"; Expression = { $_.Target -join \"`t\" } }"
Anton Krouglov
la source
Comment modifiez-vous cela pour afficher simplement les jonctions? Je ne connais pas vraiment les commandes PowerShell.
J. Scott Elblein
1
@ J.ScottElbleindir 'd:\Temp' -recurse -force | ?{$_.LinkType -eq "Junction"} | select FullName,LinkType,Target
Anton Krouglov
LinkTypene semble pas fiable pour les points d'analyse. Par exemple, sur mon ordinateur exécutant W10 avec PS 5.1, LinkTypeest nul pour "C: \ ProgramData \ Desktop" et "C: \ Users \ All Users", tandis que dir /aL(Invite de commandes, pas PowerShell) indique que le premier est un point de jonction et le second un lien symbolique.
NewSites
@NewSites utilisez-vous poweshell elevated?
Anton Krouglov
Oui, en exécutant PS ISE en tant qu'administrateur.
NewSites
3

Les liens matériels sont mieux décrits comme ci-dessus, mais pour les liens et jonctions symboliques, les éléments suivants fonctionnent bien:

Je n'utilise pas de nouvelles commandes ici, mais il améliore certaines répertoriées en vous montrant une belle liste de chaque lien trouvé, dans le chemin, son type (SymLink / Junction) et à la fois le chemin du lien et le chemin cible.

Il y en a de bons ci-dessus, mais ils ne vous donnent que le chemin TARGET, et généralement vous souhaitez supprimer le lien, et non la cible, ou corréler tous les liens et les cibles.

Pour obtenir le type, le lien et la cible, vous pouvez utiliser les éléments suivants dans 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" ) )

Exemple de sortie:

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

Far Manager 3.0 peut à la fois rechercher et afficher des liens symboliques et des points de jonction différents des fichiers et des répertoires. (Il peut faire bien d'autres choses.) Il peut également rechercher des liens durs.

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

Choisissez les attributs que vous souhaitez.

user3603546
la source
0

LinkMagic2.exe (magie de liste de jonction) est également bon.

J'ai supprimé par erreur tous mes c:\userliens Junction, tels que printhood, nethood et les données d'application lors de la première installation de Windows 7 il y a 2 ans, car je pensais qu'ils y avaient été placés par erreur lors de l'installation. Ce à quoi ils servent vraiment, c'est la rétrocompatibilité, et pendant la recherche sur Internet, je vois que certains ont eu des problèmes en essayant de faire certaines choses sans ces points de jonction.

Jim
la source