21

Команда dir /a отображает список всех файлов, папок в заданном месте. Но он отображает тип точек соединения, а также символические ссылки на папки. Есть ли какая-либо команда, которая будет отличать и сообщать мне, какие из них являются точками соединения, а какие символическими ссылками, а какие файлы жесткими?

6 ответов6

38

Вам не обязательно загружать дополнительные программы, чтобы перечислять соединения, символические и жесткие ссылки, но если у вас есть конкретные требования к формату вывода, они могут помочь.

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

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) подкаталогов recurse забило мой процессор и заняло некоторое время для завершения.
  • 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, если вы предпочитаете приложение с графическим интерфейсом

15

Почему бы не использовать 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:

перекресток -sc:\

Чтобы создать соединение c:\Program-Files для «c:\Program Files»:

C:> MD-Program-Files

C:> соединение c:\Program-Files "c:\Program Files"

Чтобы удалить перекресток, используйте ключ -d:

junction -dc:\Program-Files

7

Начиная с 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\" } }"
1

Жесткие ссылки лучше описать выше, но для символических ссылок и переходов хорошо работает следующее:

Я не использую какие-либо новые команды здесь, однако они улучшают некоторые из перечисленных, показывая хороший список каждой найденной ссылки, в пути, ее типе (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"
0

LinkMagic2.exe (магия Junction List) также хорош.

Я по ошибке удалил все свои ссылки на c:\user Junction, такие как printhood, nethood и данные приложения, когда я впервые установил Windows 7 2 года назад, потому что я думал, что они были ошибочно помещены туда установкой. На самом деле они предназначены для обратной совместимости, и при поиске в Интернете я вижу, что некоторые попали в беду, пытаясь сделать определенные вещи без этих точек соединения.

0

Far Manager 3.0 может как искать, так и отображать символические ссылки и точки соединения, отличные от файлов и каталогов. (Это может сделать так много других вещей.) Он также может искать жесткие ссылки.

ALT+F7 => [х] = Использовать фильтр> Filt е р => Ins

Выберите атрибуты, которые вы хотите.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .