Как просмотреть все символические ссылки, точки соединения, жесткие ссылки в папке с помощью директории?
Команда dir /a отображает список всех файлов, папок в заданном месте. Но он отображает тип точек соединения, а также символические ссылки на папки. Есть ли какая-нибудь команда, которая будет отличать и сообщать мне, какие из них являются точками соединения, а какие символическими ссылками, а какие файлы являются жесткими ссылками?
9 ответов
Почему бы не использовать junction.exe из SysInternals? Это позволяет вам перечислить все соединения в определенной папке или ее подпапках.
С веб-сайта:
Вступление
Windows 2000 и выше поддерживает символьные ссылки на каталоги, где каталог служит символической ссылкой на другой каталог на компьютере. Например, если каталог D:\SYMLINK указал C:\WINNT\SYSTEM32 в качестве своей цели, то приложение, обращающееся к D:\SYMLINK\DRIVERS, в действительности получило бы доступ к C:\WINNT\SYSTEM32\DRIVERS. Символические ссылки на каталоги называются переходами NTFS в Windows. К сожалению, в Windows нет инструментов для создания соединений - вам нужно приобрести Win2K Resource Kit, который поставляется вместе с связанной программой для создания соединений. Поэтому я решил написать свой собственный инструмент для создания соединений: Junction. Junction не только позволяет создавать NTFS-соединения, но и позволяет увидеть, являются ли файлы или каталоги точками повторного анализа. Точки повторной обработки представляют собой механизм, на котором основаны соединения NTFS, и они используются службой удаленного хранения Windows (RSS), а также точками монтирования тома.
Пожалуйста, прочитайте эту статью Microsoft KB для советов по использованию соединений.
Обратите внимание, что Windows не поддерживает переходы к каталогам на удаленных общих папках.
Если вы хотите просмотреть информацию повторного анализа, используйте Junction следующим образом:
Использование Junction
Используйте Junction, чтобы перечислить соединения:
Использование: [-s]
-s Recurse подкаталоги
Примеры:
Чтобы определить, является ли файл перекрестком, укажите имя файла:
перекресток c:\ test
Чтобы вывести список соединений под каталогом, включите ключ -s:
junction -sc:\
Чтобы создать соединение c:\Program-Files для "c:\ Program Files":
C:> MD-Program-Files
C:> соединение c:\Program-Files "c:\Program Files"
Чтобы удалить перекресток, используйте ключ -d:
junction -dc:\Program-Files
Вам не обязательно загружать дополнительные программы, чтобы перечислять соединения, символические и жесткие ссылки, но если у вас есть определенные требования к формату вывода, они могут помочь.
Перечислите все каталоги соединений, символических ссылок и символических ссылок в текущем каталоге и его подкаталогах:
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
Используйте утилиту findlinks Sysinternals аналогично fsutil
упомянутое выше
Используйте программу Uwe Sieber's ListLinks - смотрите ссылку для использования
Используйте Nirsoft NTFSLinksView, если вы предпочитаете приложение с графическим интерфейсом
Начиная с 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\" } }"
Far Manager 3.0 может как искать, так и отображать символические ссылки и точки соединения, отличные от файлов и каталогов. (Он может делать так много других вещей.) Он также может искать жесткие ссылки.
ALT + F7 => [x] Использовать фильтр => Фильтр => Ins
Выберите атрибуты, которые вы хотите.
Жесткие ссылки лучше описать выше, но для символических ссылок и соединений хорошо работает следующее:
Я не использую какие-либо новые команды здесь, однако они улучшают некоторые из перечисленных, показывая хороший список каждой найденной ссылки, в пути, ее типе (SymLink/Junction), а также пути ссылки и пути назначения.
Выше есть несколько хороших, но они дают только целевой путь, и обычно вы хотите удалить ссылку, а не цель, или сопоставить все ссылки и цели.
Чтобы получить Type, Link и Target, вы можете использовать следующее в 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"
Здесь есть хитрость. Используя оболочку Cygwin Bash, она покажет вам, есть ли у некоторых файлов жесткие ссылки.
Например, используяmklink /h abc2.log abc1.log
чтобы сделать их взаимно жестко связанными, вы увидите, что жесткие ссылки учитываются вls -la
выход.
LinkMagic2.exe (магия Junction List) также хорош.
Я по ошибке удалил все свои c:\user
Соединительные ссылки, такие как печать, чистота и данные приложений, когда я впервые установил Windows 7 2 года назад, потому что я думал, что они были ошибочно помещены при установке. На самом деле они предназначены для обратной совместимости, и при поиске в Интернете я вижу, что некоторые попали в беду, пытаясь сделать определенные вещи без этих точек соединения.
фсутил:
- Соединение возможно
- SymlinkD невозможен
Powershell:
:uGetTgt2 pathStr selectNum
if "%~2" equ "" ( set "nPSSub=1" ) else ( set "nPSSub=%~2" )
set "psCmn=gci '%~1*' -Di | ?{$_.Attributes -match 'ReparsePoint' -and $_.Name -eq '%~n1'} | Select -Exp Target"
if !nPSSub! equ 1 (
for /f "delims=" %%p in ('powershell -c "!psCmn!"') do ( set "dirVCVar=%%p" )
) else (
powershell -c "$vr=$(!psCmn!); [Environment]::SetEnvironmentVariable('dirVCVar', $vr, 'Machine')"
)
exit /b
CMD-скрипт:
:uGetTgt1 pathStr
set "pathVar=%~1" & call :uGetDir pathVar pathParent pathName
for /f "tokens=3,* delims=<>[" %%d in ('dir /al "!pathVar!*" 2^>nul ^| findstr /i "<junction> <symlinkd>" 2^>nul') do (
set "sPname=%%d" & if "!sPname: %pathName% =!" neq "!sPname!" (
set "dirVCVar=%%e" & set "dirVCVar=!dirVCVar:~0,-1!" & exit /b
)
)
exit /b
это все только из каталога. он сравнивает уникальное имя из-за списка подстановочных знаков.
Если ни один из этих подходов вам не подходит, возможно, у вас естьdesktop.ini
файл в папке со странным названием, который вызываетLocalizedResourceName
функция изменения имени в проводнике.
Просто хочу сказать, что люди могут оказаться здесь, когда их проблема может заключаться в другой проблеме с похожими симптомами.
(Кого я шучу? Никто не будет «приземляться сюда», как будто веб-поиск больше актуален. Я просто обучаю следующей версии ChatGPT;)