Як переглянути всі символічні посилання, точки з'єднання, жорсткі посилання в папці за допомогою dir?


30

Команда dir / a відображає список усіх файлів, папок у заданому місці. Але він відображає тип Junction Points, а також символьні посилання на папки. Чи є якась команда, яка розмежуватиме та скаже мені, які з них є "Junction Points" та "Symbolic", а також які файли є жорсткими?

Відповіді:


18

Чому б не використовувати junction.exe від SysInternals? Це дозволяє перелічити всі з'єднання в певній папці або її підпапках.

З веб-сайту:

Вступ

Windows 2000 і новіші версії підтримують символьні посилання каталогів, де каталог служить символьним посиланням на інший каталог на комп'ютері. Наприклад, якщо каталог D: \ SYMLINK вказав C: \ WINNT \ SYSTEM32 як свою ціль, то програма, що отримує доступ до D: \ SYMLINK \ DRIVERS, насправді матиме доступ до C: \ WINNT \ SYSTEM32 \ DRIVERS. Символічні посилання каталогів відомі як NTFS-переходи в Windows. На жаль, Windows не має інструментів для створення розв’язок - вам потрібно придбати Win2K Resource Kit, який постачається разом із пов'язаною програмою для створення стиків. Тому я вирішив написати власний інструмент для створення з'єднань: Junction. З'єднання не тільки дозволяє створювати NTFS-з'єднання, але й дозволяє вам бачити, чи файли чи каталоги насправді є точками повторного розбору. Точки повторного аналізу - це механізм, на якому базуються стики NTFS,

Прочитайте цю статтю Microsoft KB, щоб отримати поради щодо використання переходів.

Зауважте, що Windows не підтримує переходи до каталогів на віддалених спільних ресурсах.

Якщо ви хочете переглянути інформацію про повторний аналіз, використання для Junction таке:

Використання з'єднання

Використовуйте перехід, щоб перелічити переходи:

Використання: [-s]

-s Рекурсивні підкаталоги

Приклади:

Щоб визначити, чи є файл стиком, вкажіть ім'я файлу:

перехід c: \ тест

Щоб переглянути переходи під каталогом, включіть перемикач –s:

перехід -sc: \

Для створення переходу c: \ Program-Files для "c: \ Program Files":

C:> Файли програм-md

C:> перехід c: \ Program-Files "c: \ Program Files"

Щоб видалити з'єднання, використовуйте перемикач –d:

junction -dc: \ Program-Files


1
"з'єднання" може ідентифікувати символічні посилання та точки з'єднання. Спасибі. Це не визначає жорстких зв’язків. Яка команда дасть мені список усіх файлів / імен файлів, на які є посилання. Як варіант, чи є спосіб отримати кількість посилань на файл? Я знаю, що кількість посилань у файлі відповідає кількості жорстких посилань.
Dhiwakar Ravikumar

2
Вам доведеться запускати fsutil над кожним файлом, щоб виявити жорсткі
Ganesh R.

49

Не обов’язково завантажувати додаткові програми, щоб перелічити переходи, символьні посилання та жорсткі посилання, але якщо у вас є конкретні вимоги до вихідного формату, вони можуть допомогти.

Перерахуйте всі каталоги переходів, символьних посилань та символьних посилань у поточному каталозі та його підкаталогах:

dir /al /s

Або якщо ви хочете, щоб їх було вказано окремо ...

Перерахуйте всі з'єднання в поточному каталозі та його підкаталогах:

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

Перерахуйте всі посилання в поточному каталозі та його підкаталогах:

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

Перерахуйте всі каталоги символьних посилань у поточному каталозі та його підкаталогах:

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

Тут lє ключовим прапором атрибута; lпризначений для Reparse Points(каталоги переходів, символьних посилань та символьних посилань)

Жорсткі посилання

На жаль, dirсписок жорстких посилань є звичайними файлами, тому ви не можете використовувати їх для ідентифікації жорстких посилань. Ви використовуєте вбудований fsutilнатомість. Його потрібно запустити з підвищеного командного рядка.

З fsutil, перерахуйте всі жорсткі посилання в поточному каталозі та його підкаталогах:

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.

Цей одноколісний шар не є ідеальним, і я вітаю будь-які вдосконалення.

  • Використання forfilesпараметрів підкаталогій повторного запису ( /s) забило мій процесор, і на його завершення пішло час.
  • В fsutilосновному закінчується бігом двічі; перший раз ідентифікувати жорсткі посилання шляхом підрахунку кількості вихідних рядків, що повертаються під час кожного виклику, і другий раз на щойно знайдених жорстких посиланнях, щоб отримати правильний вихід.
  • Будуть дублікати рядків. Щоб їх усунути, ви хочете перенаправити вихід у файл, а потім запустити файл через такий інструмент, як uniq.

Ось пакетний файл, який використовується лише forдля виявлення жорстких посилань. Оскільки forfilesце не задіяно, воно може бути трохи швидшим, однак воно все ще страждає від інших застережень вищевказаного одноводкового.

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

Є кілька інших (неперевірених) варіантів:

Використовуйте (стару) утиліту Microsoft HL Scan

hlscan /dir %CD%

Скористайтеся командою альтернативного пошуку, яка постачається з інструментальним інструментом Microsoft SFUA:

find . -links +1

Використовуйте утиліту пошуку посилань Sysinternals аналогічним чином, як fsutilзазначено вище

Використовуйте програму ListLinks Uwe Sieber - див. Посилання для використання

Використовуйте NTFSLinksView Nirsoft, якщо ви віддаєте перевагу додатку GUI


У Windows 7 dir / al / s не відображає каталог симпосилань ОП із тегом Windows 7, тому це не відповідає на питання ОП.
в'язниця

@jaylweb (1) dir / al / s перераховує всі точки повторного розбору. Далі дивіться мою відповідь на перелік лише каталогів посилання. (2) Ви помиляєтесь, це відповідає на питання.
Джимадін

11

Наступний однолінійний рекурсивно на Powershell 5+ перелічує всі жорсткі посилання файлів, з'єднання каталогів та символічні посилання та їх цілі, починаючи з d:\Temp\:

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

Вихід:

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}

Якщо ви переймаєтесь кількома цілями для жорстких посилань, використовуйте цей варіант, у якому перелічені розділені на вкладку цілі:

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

Можливо, вам знадобляться права адміністратора, щоб запустити цей скрипт у відповідь C:\.

Для запуску цих сценаріїв із традиційного командного рядка (cmd.exe):

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

Наприклад:

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

Як ви можете це змінити, щоб просто показати З'єднання? Я не справді знайомий з командами PowerShell.
Дж. Скотт Елблін

1
@ J.ScottElbleindir 'd:\Temp' -recurse -force | ?{$_.LinkType -eq "Junction"} | select FullName,LinkType,Target
Антон Круглов

LinkTypeне здається надійним для повторних балів. Наприклад, на моєму комп'ютері, на якому працює W10 з PS 5.1, LinkTypeє нульовим значення як для "C: \ ProgramData \ Desktop", так і "C: \ Користувачі \ Усі користувачі", тоді як dir /aL(Command Prompt, а не PowerShell) вказує, що перша є точкою стику. а друга символічна ланка.
NewSites

@NewSites Ви маєте підвищений рівень?
Антон Круглов

Так, запуск PS ISE як адміністратор.
NewSites

3

Жорсткі посилання краще описані вище, але для символічних посилань та з'єднань добре працює:

Я не використовую тут ніяких нових команд, однак він покращується за деякими переліченими, показуючи вам приємний список кожного знайденого посилання, на шляху - це тип (SymLink / Junction), а також шлях посилання та цільовий шлях.

Вище є кілька хороших, але вони дають вам лише ТАРГЕТНИЙ шлях, і зазвичай ви хочете видалити посилання, а не ціль, або співвіднести всі посилання та цілі.

Щоб отримати тип, посилання та ціль, ви можете використовувати наступне в 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" ) )

Приклад виводу:

SYMLINK: "G:\FTP\Root" → "G:\FTP\Data"
JUNCTION: "G:\FTP\Junctioned\BT\02" → "W:\FTPRoot\02"

1

Far Manager 3.0 може як шукати, так і відображати символьні посилання та точки з'єднання на відміну від файлів і каталогів. (Це може зробити так багато інших речей.) Він також може шукати жорсткі посилання.

ALT+ F7=> [x] Використовуйте filter => Filt er =>Ins

Виберіть потрібні атрибути.


0

LinkMagic2.exe (магія списку з'єднань ) також хороша.

Я помилково видалив усі свої c:\userпосилання Junction, такі як друкованість, мережевість та дані додатків, коли я вперше встановив Windows 7 2 роки тому, тому що думав, що вони були встановлені туди помилково. Те, що вони насправді, - це зворотна сумісність, і під час пошуку в Інтернеті я бачу, що у деяких виникли проблеми, намагаючись робити певні речі без цих точок стику.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.