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


30

O comando dir / a exibe uma lista de todos os arquivos, pastas em um determinado local. Mas ele exibe o tipo de pontos de junção e links simbólicos para pastas. Existe algum comando que diferencie e me diga quais desses são pontos de junção e quais são os links simbólicos e quais dos arquivos são links físicos?

Respostas:


18

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

A partir do site:

Introdução

O Windows 2000 e superior oferecem suporte a links simbólicos de diretório, onde um diretório serve como um link simbólico para outro diretório no computador. Por exemplo, se o diretório D: \ SYMLINK especificasse C: \ WINNT \ SYSTEM32 como destino, um aplicativo que acessa D: \ SYMLINK \ DRIVERS na realidade estaria acessando C: \ WINNT \ SYSTEM32 \ DRIVERS. Os links simbólicos do diretório são conhecidos como junções NTFS no Windows. Infelizmente, o Windows não possui ferramentas para criar junções - você precisa adquirir o Win2K Resource Kit, que acompanha o programa linkd para criar junções. Decidi, portanto, escrever minha própria ferramenta de criação de junções: Junction. A junção não apenas permite criar junções NTFS, mas também verificar se os arquivos ou diretórios são realmente pontos de nova análise. Os pontos de nova análise são o mecanismo no qual as junções NTFS se baseiam,

Leia este artigo da Microsoft KB para obter dicas sobre o uso de junções.

Observe que o Windows não suporta junções em diretórios em compartilhamentos remotos.

Se você deseja visualizar informações de nova análise, o uso de Junction é o seguinte:

Usando junção

Use junção para listar junções:

Uso: [-s]

-s subdiretórios Recurse

Exemplos:

Para determinar se um arquivo é uma junção, especifique o nome do arquivo:

junção c: \ test

Para listar junções abaixo de um diretório, inclua a opção –s:

junção -sc: \

Para criar uma junção c: \ Arquivos de Programas para "c: \ Arquivos de Programas":

C:> md Arquivos de Programa

C:> junção c: \ Arquivos de Programas "c: \ Arquivos de Programas"

Para excluir uma junção, use a opção –d:

junção -dc: \ Arquivos de Programas


1
"junção" pode identificar links simbólicos e pontos de junção. Obrigado. Não identifica links físicos. Que comando me dará uma lista de todos os arquivos / nomes de arquivos vinculados por ele. Como alternativa, existe alguma maneira de obter a contagem de links de um arquivo? Eu sei que a contagem de links de um arquivo corresponde a quantos links físicos ele possui.
Dhiwakar Ravikumar

2
Você terá de fogo fsutil sobre cada arquivo para detectar hardlinks serverfault.com/questions/319134/...
Ganesh R.

49

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

Liste todas as junções, links simbólicos e diretórios de links simbólicos no diretório atual e seus subdiretórios:

dir /al /s

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

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

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

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

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

Liste todos os diretórios de link simbólico no diretório atual e seus subdiretórios:

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

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

Links físicos

Infelizmente, dirlista os links físicos como arquivos normais; portanto, você não pode usá-lo para identificar os links físicos. Você pode usar o embutido fsutil. Ele precisa ser executado em um prompt de comando elevado.

Com fsutil, liste todos os links físicos no diretório atual e 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 quaisquer melhorias.

  • Usar forfilescom a opção de subdiretórios recurse ( /s) martelou minha CPU e demorou um pouco para ser concluído.
  • O fsutilbasicamente acaba rodando duas vezes; a primeira vez para identificar os links físicos contando o número de linhas de saída retornadas por cada chamada e a segunda vez nos links físicos 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 depois executá-lo através de uma ferramenta como a uniq.

Aqui está um arquivo em lotes usado apenas forpara identificar links físicos. Como forfilesnão está envolvido, pode ser um pouco mais rápido, no entanto, ainda sofre as ressalvas restantes da linha única acima.

@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 utilitário Microsoft HL Scan (antigo)

hlscan /dir %CD%

Use o comando find alternativo que acompanha o kit de ferramentas do utilitário SFUA da Microsoft:

find . -links +1

Use o utilitário findlinks da Sysinternals de maneira semelhante à fsutilmencionada acima

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

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


No Windows 7, dir / al / s não mostra um diretório de link simbólico O OP marcou o Windows 7, portanto, isso não responde à pergunta dos OPs.
jaylweb

@jaylweb (1) dir / al / s lista todos os pontos de nova análise. Veja mais abaixo minha resposta para listar apenas diretórios de links simbólicos. (2) Você está errado, isso responde à pergunta.
Jimadine #

11

A partir do Powershell 5+, o one-liner a seguir lista recursivamente todos os hardlinks de arquivos, junções de diretório e links simbólicos e seus destinos, 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 links físicos, use esta variação que lista os destinos separados por tabulação:

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, digamos 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\" } }"

Como você altera isso para mostrar apenas junções? Não estou familiarizado com os comandos do PowerShell.
J. Scott Elblein em 25/03

1
@ J.ScottElbleindir 'd:\Temp' -recurse -force | ?{$_.LinkType -eq "Junction"} | select FullName,LinkType,Target
Anton Krouglov

LinkTypenão parece ser confiável para pontos de nova análise. Por exemplo, no meu computador executando W10 com PS 5.1, LinkTypeé nulo para "C: \ ProgramData \ Desktop" e "C: \ Users \ All Users", enquanto que dir /aL(Prompt de comando, não PowerShell) indica que o primeiro é um ponto de junção e o segundo um link simbólico.
NewSites

@NewSites você está executando o poweshell elevado?
Anton Krouglov 18/10

Sim, executando o PS ISE como administrador.
NewSites 18/10

3

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

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

Existem alguns bons acima, mas eles apenas 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\02" → "W:\FTPRoot\02"

1

O Far Manager 3.0 pode procurar 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 links físicos.

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

Escolha os atributos que você deseja.


0

LinkMagic2.exe (lista mágica de junções) também é bom.

Eu excluí por engano todos os meus c:\userlinks de junção, como dados de impressão, nethood e aplicativos, quando instalei o Windows 7 pela primeira vez há 2 anos, porque pensei que eles foram colocados por engano na instalação. O que eles realmente querem é a compatibilidade com versões anteriores e, ao pesquisar na Internet, vejo que alguns tiveram problemas ao tentar fazer certas coisas sem esses pontos de junção.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.