¿Cómo ver todos los enlaces simbólicos, puntos de unión, enlaces duros en una carpeta usando dir?

30

El comando dir / a muestra una lista de todos los archivos, carpetas en una ubicación determinada. Pero muestra el tipo de puntos de unión, así como enlaces simbólicos a carpetas. ¿Hay algún comando que diferencie y me diga cuáles de estos son puntos de unión y cuáles son enlaces simbólicos y cuáles de los archivos son enlaces duros?

Dhiwakar Ravikumar
fuente

Respuestas:

18

¿Por qué no usar junction.exe de SysInternals? Le permite enumerar todas las uniones en una carpeta particular o sus subcarpetas.

Desde el sitio web:

Introducción

Windows 2000 y superior admite enlaces simbólicos de directorio, donde un directorio sirve como un enlace simbólico a otro directorio en la computadora. Por ejemplo, si el directorio D: \ SYMLINK especifica C: \ WINNT \ SYSTEM32 como su objetivo, entonces una aplicación que acceda a D: \ SYMLINK \ DRIVERS en realidad estaría accediendo a C: \ WINNT \ SYSTEM32 \ DRIVERS. Los enlaces simbólicos de directorio se conocen como uniones NTFS en Windows. Desafortunadamente, Windows no tiene herramientas para crear uniones: debe comprar el Kit de recursos de Win2K, que viene con el programa vinculado para crear uniones. Por lo tanto, decidí escribir mi propia herramienta para crear uniones: Junction. La unión no solo le permite crear uniones NTFS, sino que también le permite ver si los archivos o directorios son realmente puntos de análisis. Los puntos de análisis son el mecanismo en el que se basan las uniones NTFS,

Lea este artículo de Microsoft KB para obtener sugerencias sobre el uso de uniones.

Tenga en cuenta que Windows no admite uniones a directorios en recursos compartidos remotos.

Si desea ver información de análisis, el uso de Junction es el siguiente:

Usando Junction

Use la unión para enumerar las uniones:

Uso: [-s]

-s Subdirectorios recurrentes

Ejemplos:

Para determinar si un archivo es una unión, especifique el nombre del archivo:

unión c: \ prueba

Para enumerar uniones debajo de un directorio, incluya el modificador –s:

unión -sc: \

Para crear una unión c: \ Archivos de programa para "c: \ Archivos de programa":

C:> Archivos de programa md

C:> unión c: \ Archivos de programa "c: \ Archivos de programa"

Para eliminar una unión, use el modificador –d:

unión -dc: \ Archivos de programa

Ganesh R.
fuente
1
"unión" puede identificar enlaces simbólicos y puntos de unión. Gracias. No identifica enlaces duros. ¿Qué comando me dará una lista de todos los archivos / nombres de archivo que los enlaces duros? Alternativamente, ¿hay alguna forma de obtener el recuento de enlaces de un archivo? Sé que el recuento de enlaces de un archivo corresponde a cuántos enlaces duros tiene.
Dhiwakar Ravikumar
2
Tendrá que disparar fsutil sobre cada archivo para detectar enlaces duros serverfault.com/questions/319134/…
Ganesh R.
49

No necesariamente necesita descargar programas adicionales para enumerar uniones, enlaces simbólicos y enlaces duros, pero si tiene requisitos de formato de salida específicos, pueden ayudar.

Enumere todas las uniones, enlaces simbólicos y directorios de enlaces simbólicos en el directorio actual y sus subdirectorios:

dir /al /s

O si quieres que se enumeren por separado ...

Enumere todas las uniones en el directorio actual y sus subdirectorios:

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

Lista todos los enlaces simbólicos en el directorio actual y sus subdirectorios:

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

Enumere todos los directorios de enlaces simbólicos en el directorio actual y sus subdirectorios:

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

El lindicador de atributo es clave aquí; les para Reparse Points(uniones, enlaces simbólicos y directorios de enlaces simbólicos)

Enlaces duros

Desafortunadamente, direnumera los enlaces duros como archivos normales, por lo que no puede usarlos para identificar enlaces duros. Puedes usar el incorporado en su fsutillugar. Debe ejecutarse desde un símbolo del sistema elevado.

Con fsutil, enumere todos los enlaces duros en el directorio actual y sus subdirectorios:

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.

Este one-liner no es ideal, y agradecería cualquier mejora.

  • Usar forfilescon la opción de subdirectorios recurse ( /s) martilló mi CPU y tardé un tiempo en completarse.
  • El fsutilbásicamente termina corriendo dos veces; la primera vez para identificar los enlaces duros contando el número de líneas de salida devueltas por cada llamada, y la segunda vez en los enlaces duros recién encontrados para obtener la salida correcta.
  • Habrá líneas duplicadas. Para eliminarlos, querrá redirigir la salida a un archivo y luego ejecutar el archivo a través de una herramienta como uniq.

Aquí hay un archivo por lotes que se usa solo forpara identificar enlaces duros. Como forfilesno está involucrado, puede ser un poco más rápido, sin embargo, todavía sufre las advertencias restantes de la línea anterior.

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

Hay algunas otras opciones (no probadas):

Use la utilidad (antigua) Microsoft HL Scan

hlscan /dir %CD%

Use el comando find alternativo que viene con el kit de herramientas de utilidad SFUA de Microsoft:

find . -links +1

Utilice la utilidad findlinks de Sysinternals de una manera similar a la fsutilmencionada anteriormente

Use el programa ListLinks de Uwe Sieber - vea el enlace para el uso

El uso de Nirsoft NTFSLinksView Si prefiere una aplicación GUI

Jimadine
fuente
En Windows 7, dir / al / s no muestra un directorio de enlace simbólico El OP etiquetó Windows 7, por lo tanto, esto no responde a la pregunta de los OP.
jaylweb
@jaylweb (1) dir / al / s enumera todos los puntos de análisis. Vea más abajo mi respuesta para listar solo directorios de enlaces simbólicos. (2) Estás equivocado, esto responde la pregunta.
Jimadine
11

A partir de Powershell 5+, el siguiente one-liner enumera recursivamente todos los enlaces duros de archivos, uniones de directorio y enlaces simbólicos y sus objetivos a partir de d:\Temp\:

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

Salida:

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 le interesan los objetivos múltiples para enlaces duros, use esta variación que enumera los objetivos separados por tabuladores:

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

Es posible que necesite privilegios de administrador para ejecutar este script en say C:\.

Para ejecutar estos scripts desde la línea de comandos tradicional (cmd.exe):

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

Por ejemplo:

C:\>PowerShell.exe -NoProfile -ExecutionPolicy Bypass -Command "dir 'd:\Temp' -recurse -force | ?{ $_.LinkType } | select FullName, LinkType, @{ Name = \"Targets\"; Expression = { $_.Target -join \"`t\" } }"
Anton Krouglov
fuente
¿Cómo se altera esto para mostrar Junctions? No estoy muy familiarizado con los comandos de PowerShell.
J. Scott Elblein
1
@ J.ScottElbleindir 'd:\Temp' -recurse -force | ?{$_.LinkType -eq "Junction"} | select FullName,LinkType,Target
Anton Krouglov
LinkTypeno parece ser confiable para puntos de análisis. Por ejemplo, en mi computadora que ejecuta W10 con PS 5.1, LinkTypees nulo tanto para "C: \ ProgramData \ Desktop" como para "C: \ Users \ All Users", mientras que dir /aL(Símbolo del sistema, no PowerShell) indica que el primero es un punto de unión y el segundo un enlace simbólico.
NewSites
@NewSites, ¿estás ejecutando Poweshell Elevado?
Anton Krouglov
Sí, ejecutando PS ISE como administrador.
NewSites
3

Los enlaces duros se describen mejor como anteriormente, pero para enlaces simbólicos y uniones, lo siguiente funciona muy bien:

No estoy usando ningún comando nuevo aquí, sin embargo, mejora algunos de los enumerados al mostrarle una buena lista de cada enlace encontrado, en la ruta, es tipo (SymLink / Junction) y tanto la ruta de enlace como la ruta de destino.

Hay algunos buenos arriba, pero solo le dan la ruta OBJETIVO, y generalmente desea eliminar el enlace, y no el objetivo, o correlacionar todos los enlaces y objetivos.

Para obtener el Tipo, Enlace y Destino, puede usar lo siguiente en 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" ) )

Salida de ejemplo:

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

Far Manager 3.0 puede buscar y mostrar enlaces simbólicos y puntos de unión como diferentes de archivos y directorios. (Puede hacer muchas otras cosas). También puede buscar enlaces duros.

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

Elige los atributos que quieras.

user3603546
fuente
0

LinkMagic2.exe (lista de conexiones mágica) también es bueno.

c:\userBorré por error todos mis enlaces de Junction, como printhood, nethood y datos de la aplicación cuando instalé Windows 7 por primera vez hace 2 años porque pensé que la instalación los colocó por error. Para lo que realmente son es la compatibilidad con versiones anteriores, y mientras busco en Internet veo que algunos se han tenido problemas para tratar de hacer ciertas cosas sin estos puntos de unión.

Jim
fuente