Como visualizar todos os links simbólicos, pontos de junção, links físicos em uma pasta usando dir?

19

O comando dir / a exibe uma lista de todos os arquivos, pastas em um determinado local. Mas exibe o tipo de pontos de junção, bem como links simbólicos para pastas. Existe algum comando que diferencie e me diga quais destes são os Pontos de Junção e quais são os links simbólicos, bem como quais dos arquivos são hard links?

    
por Dhiwakar Ravikumar 11.10.2014 / 20:14

6 respostas

14

Por que não usar junction.exe da SysInternals? Ele permite que você liste todas as junções em uma pasta específica ou em suas subpastas.

Do site:

Introduction

Windows 2000 and higher supports directory symbolic links, where a directory serves as a symbolic link to another directory on the computer. For example, if the directory D:\SYMLINK specified C:\WINNT\SYSTEM32 as its target, then an application accessing D:\SYMLINK\DRIVERS would in reality be accessing C:\WINNT\SYSTEM32\DRIVERS. Directory symbolic links are known as NTFS junctions in Windows. Unfortunately, Windows comes with no tools for creating junctions—you have to purchase the Win2K Resource Kit, which comes with the linkd program for creating junctions. I therefore decided to write my own junction-creating tool: Junction. Junction not only allows you to create NTFS junctions, it allows you to see if files or directories are actually reparse points. Reparse points are the mechanism on which NTFS junctions are based, and they are used by Windows' Remote Storage Service (RSS), as well as volume mount points.

Please read this Microsoft KB article for tips on using junctions.

Notethat Windows does not support junctions to directories on remote shares.

If you want to view reparse information, the usage for Junction is the following:

Using Junction

Use junction to list junctions:

Usage: [-s]

-s Recurse subdirectories

Examples:

To determine if a file is a junction, specify the file name:

junction c:\test

To list junctions beneath a directory, include the –s switch:

junction -s c:\

To create a junction c:\Program-Files for "c:\Program Files":

C:>md Program-Files

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

To delete a junction, use the –d switch:

junction -d c:\Program-Files

    
por 11.10.2014 / 22:31
36

Você não precisa necessariamente baixar programas adicionais para listar junções, links simbólicos e hard links, mas se você tiver requisitos de formato de saída específicos, eles podem ajudar.

Liste todos os diretórios junções, links simbólicos e links simbólicos no diretório atual e em seus subdiretórios:

dir /al /s

Ou se você quiser que eles sejam listados separadamente ...

Listar todas as junções no diretório atual e em seus subdiretórios:

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

Listar todos os links simbólicos no diretório atual e em seus subdiretórios:

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

Listar todos os diretórios de links simbólicos no diretório atual e em seus subdiretórios:

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

O sinalizador do atributo l é a chave aqui; l é para Reparse Points (diretórios de junções, links simbólicos e links simbólicos)

Links físicos

Infelizmente dir lista links físicos como arquivos normais, portanto você não pode usá-lo para identificar links físicos. Você usa o fsutil inerente. Ele precisa ser executado a partir de um prompt de comando elevado.

Com fsutil , liste todos os links físicos no diretório atual e em seus subdiretórios:

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 não é o ideal, e eu gostaria de receber melhorias.

  • Usando forfiles com a opção de subdiretórios recurse ( /s ) martelou minha CPU e demorou um pouco para completar.
  • O fsutil basicamente acaba rodando duas vezes; a primeira vez para identifique os links físicos contando o número de linhas de saída retornadas por cada chamada e a segunda vez em hard links recém-encontrados para obter a saída correta.
  • Haverá linhas duplicadas. Para eliminá-los, você deseja redirecionar a saída para um arquivo e, em seguida, executar o arquivo por meio de uma ferramenta como uniq .

Aqui está um arquivo em lote que usa apenas for para identificar links físicos. Como forfiles não está envolvido, pode ser um pouco mais rápido, no entanto, ele ainda sofre as advertências restantes do acima de uma linha.

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

Existem algumas outras opções (não testadas):

Use o (antigo) Microsoft HL Scan utilitário

hlscan /dir %CD%

Use o comando localizar alternativo que vem com o kit de ferramentas de utilitários SFUA da Microsoft:

find . -links +1

Use o utilitário findlinks da Sysinternals de maneira semelhante a fsutil mencionado acima

Use o programa ListLinks de Uwe Sieber - veja o link para uso

Use o NTFSLinksView da Nirsoft, se você preferir um aplicativo GUI

    
por 19.03.2016 / 14:13
5

A partir do Powershell 5+, o seguinte one-liner lista recursivamente todos os hardlinks de arquivos, junções de diretórios e links simbólicos e seus alvos a partir de d:\Temp\ :

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

Saída:

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 você se preocupa com vários destinos para hardlinks, use essa variação, que lista os destinos separados por guias:

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

Você pode precisar de privilégios de administrador para executar este script em C:\ .

Para executar esses scripts a partir da linha de comando tradicional (cmd.exe):

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

Por exemplo:

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

Os links físicos são melhor descritos acima, mas para os links simbólicos e Junções, o seguinte funciona bem:

Não estou usando nenhum comando novo aqui, mas ele melhora alguns listados, mostrando uma boa lista de cada link encontrado, no caminho, no tipo (SymLink / Junction) e no caminho do link e no caminho de destino .

Existem alguns bons acima, mas eles só fornecem o caminho TARGET e geralmente você deseja excluir o link, e não o destino, ou correlacionar todos os links e destinos.

Para obter o tipo, link e destino, você pode usar o seguinte no 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" ) )

Exemplo de saída:

SYMLINK: "G:\FTP\Root" → "G:\FTP\Data"
JUNCTION: "G:\FTP\Junctioned\BT" → "W:\FTPRoot"
    
por 24.10.2016 / 19:25
0

LinkMagic2.exe (lista de junção mágica) também é bom.

Por engano, excluí todos os meus links c:\user Junction, como printhood, nethood e dados do aplicativo quando instalei o windows 7 há 2 anos, porque achei que eles foram colocados por engano pela instalação. O que eles realmente são para compatibilidade com versões anteriores e, enquanto pesquisam na internet, vejo alguns que se deram ao trabalho de tentar fazer certas coisas sem esses pontos de junção.

    
por 28.12.2015 / 19:47
0

O Far Manager 3.0 pode pesquisar e exibir links simbólicos e pontos de junção diferentes dos arquivos e diretórios. (Ele pode fazer muitas outras coisas.) Também pode procurar por hard links.

ALT + F7 = > [x] Use filter = > Filt e r = > Ins

Escolha os atributos desejados.

    
por 29.11.2017 / 14:26