web-dev-qa-db-fra.com

Comment afficher tous les liens symboliques, points de jonction, liens physiques dans un dossier à l'aide de dir?

La commande dir/a affiche une liste de tous les fichiers, dossiers situés à 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 et quels fichiers sont des liens durs?

25
Dhiwakar Ravikumar

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

Sur le site:

Introduction

Windows 2000 et les versions ultérieures prennent en charge les liens symboliques de répertoire, un répertoire servant de lien symbolique vers un autre répertoire de l'ordinateur. Par exemple, si le répertoire D:\SYMLINK spécifie 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 connus sous le nom de jonctions NTFS dans Windows. Malheureusement, Windows ne dispose pas d'outils pour créer des jonctions. Vous devez acheter le Kit de ressources Win2K, fourni avec le programme linkd pour la création de jonctions. J'ai donc décidé d'écrire mon propre outil de création de jonction: Junction. Junction vous permet non seulement de créer des jonctions NTFS, mais également de voir si des fichiers ou des répertoires sont réellement des points d'analyse. Les points d'analyse sont le mécanisme sur lequel sont basées les jonctions NTFS. Ils sont utilisés par le service de stockage distant (RSS) de Windows, ainsi que par les points de montage de volume.

Veuillez lire cet article de la base de connaissances Microsoft pour des conseils sur l’utilisation des jonctions.

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

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

Utilisation de jonction

Utilisez junction pour lister les jonctions:

Coutumes]

-s Recurse sous-répertoires

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 -s c: \

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:

jonction -d c:\Program-Files

17
Ganesh R.

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 physiques, mais si vous avez des exigences de format de sortie spécifiques, elles peuvent être utiles.

Répertoriez tous les jonctions, liens symboliques et répertoires de liens symboliques du répertoire actuel et de ses sous-répertoires:

dir /al /s

Ou si vous voulez les lister séparément ...

Répertoriez toutes les jonctions du répertoire en cours et de ses sous-répertoires:

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

Répertoriez tous les liens symboliques du répertoire en cours et de ses sous-répertoires:

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

Répertoriez tous les répertoires de liens symboliques du répertoire actuel et de ses sous-répertoires:

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

L'indicateur d'attribut l est la clé ici; l est pour Reparse Points (jonctions, liens symboliques et répertoires de liens symboliques)

Liens durs

Malheureusement, dir répertorie les liens physiques en tant que fichiers normaux. Vous ne pouvez donc pas les utiliser pour identifier des liens physiques. Vous pouvez utiliser la variable fsutil incorporée à la place. Il doit être exécuté à partir d'une invite de commande élevée.

Avec fsutil, listez tous les liens physiques dans le répertoire actuel 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 toute amélioration serait la bienvenue.

  • L'utilisation de forfiles avec l'option de sous-répertoires recurse (/s) a martelé mon processeur et pris un certain temps.
  • La fsutil finit par courir deux fois; la première fois pour identifier les liens durs en comptant le nombre de lignes de sortie renvoyées par chaque appel, et la deuxième fois sur des liens durs trouvés pour obtenir le résultat correct.
  • Il y aura des doublons. Pour les éliminer, vous souhaitez rediriger la sortie vers un fichier, puis l'exécuter via un outil tel que uniq.

Voici un fichier de commandes qui utilise uniquement for pour identifier les liens physiques. Comme forfiles n’est pas impliqué, il est peut-être légèrement plus rapide, mais il souffre toujours des mises en garde restantes de la ligne précédente.

@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 le (ancien) Microsoft HL Scan utility

hlscan /dir %CD%

Utilisez la commande alternative find fournie avec le kit d'outils de l'utilitaire SFUA de Microsoft:

find . -links +1

Utilisez les findlinks utility de Sysinternals de la même manière que fsutil mentionné ci-dessus

Utiliser le Uwe Sieber ListLinks program - voir le lien d'utilisation

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

44
Jimadine

À partir de Powershell 5+, la liste suivante répertorie de manière récursive tous les liens physiques de fichiers, les jonctions de répertoires, 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 des 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 aurez peut-être besoin de privilèges d'administrateur pour exécuter ce script avec le code 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\" } }"
9
Anton Krouglov

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

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

Il y en a quelques-uns de bons ci-dessus, mais ils ne vous donnent que le chemin TARGET, et vous souhaitez généralement 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"
2
Ben Personick

LinkMagic2.exe (Magie de la liste de jonctions) est également bon.

J'ai effacé par erreur tous mes liens c:\user Junction, tels que printhood, nethood et les données d'application lorsque j'ai installé Windows 7 pour la première fois il y a 2 ans, car je pensais qu'ils avaient été placés par erreur lors de l'installation. Ce qui leur sert vraiment, c’est la compatibilité ascendante, et lors de mes recherches sur Internet, je constate que certains ont eu du mal à essayer de faire certaines choses sans ces points de jonction.

0
Jim

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 beaucoup d'autres choses.) Il peut également rechercher des liens en dur.

ALT+F7 => [x] Utiliser le filtre => Filter => Ins

Choisissez les attributs que vous voulez.

0
user3603546