Команда dir /a отображает список всех файлов, папок в заданном месте. Но он отображает тип точек соединения, а также символические ссылки на папки. Есть ли какая-либо команда, которая будет отличать и сообщать мне, какие из них являются точками соединения, а какие символическими ссылками, а какие файлы жесткими?
6 ответов
Вам не обязательно загружать дополнительные программы, чтобы перечислять соединения, символические и жесткие ссылки, но если у вас есть конкретные требования к формату вывода, они могут помочь.
Перечислите все каталоги соединений, символических ссылок и символических ссылок в текущем каталоге и его подкаталогах:
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, если вы предпочитаете приложение с графическим интерфейсом
Почему бы не использовать 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
Начиная с 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\" } }"
Жесткие ссылки лучше описать выше, но для символических ссылок и переходов хорошо работает следующее:
Я не использую какие-либо новые команды здесь, однако они улучшают некоторые из перечисленных, показывая хороший список каждой найденной ссылки, в пути, ее типе (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"
LinkMagic2.exe (магия Junction List) также хорош.
Я по ошибке удалил все свои ссылки на c:\user
Junction, такие как printhood, nethood и данные приложения, когда я впервые установил Windows 7 2 года назад, потому что я думал, что они были ошибочно помещены туда установкой. На самом деле они предназначены для обратной совместимости, и при поиске в Интернете я вижу, что некоторые попали в беду, пытаясь сделать определенные вещи без этих точек соединения.
Far Manager 3.0 может как искать, так и отображать символические ссылки и точки соединения, отличные от файлов и каталогов. (Это может сделать так много других вещей.) Он также может искать жесткие ссылки.
ALT+F7 => [х] = Использовать фильтр> Filt е р => Ins
Выберите атрибуты, которые вы хотите.