Вопрос или проблема
Я создал несколько жестких ссылок в файловой системе Windows 7 с использованием mklink. Это было некоторое время назад, и я точно не помню, где или на какие файлы. Когда я использую Проводник, все файлы выглядят одинаково. Когда я использую командную строку и ввожу “dir”, они все выглядят одинаково.
Как найти жесткие ссылки? Или как определить, является ли конкретный файл жесткой ссылкой?
Все файлы – это жесткие ссылки с числом ссылок не менее 1.
Поэтому файлы выглядят одинаково. Они одинаковы. Кажется, вы ищете файлы, у которых есть более одной ссылки на файл. Существует очень мало отличий между файлом с числом ссылок больше одного и файлом с числом ссылок один… за исключением числа ссылок (и некоторого странного поведения, связанного с атрибутами и датами).
И это очень легко проверить с командой find
, которая есть в Подсистеме Windows для Linux: find . -links +1
.
кстати, Подсистема Windows для Linux ранее называлась “Подсистема для приложений на основе UNIX” в 2008 году для Windows-Server-2008 (более подробная информация https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/cc772343(v=ws.11)?redirectedfrom=MSDN ).
В Windows 7 (также работает в Windows 10), используйте команду:
fsutil hardlink list MyFileName.txt
Она перечисляет все жесткие ссылки на файл с именем MyFileName.txt
.
К сожалению, операционная система не может найти все ваши жесткие ссылки без проверки каждого файла.
Для Проводника вы можете скачать очень удобное Расширение оболочки для ссылок, которое отмечает файлы с жесткими ссылками красной стрелкой, похожей на ярлык.
Оно также делает создание жестких ссылок, символических ссылок и соединений через контекстное меню Проводника довольно простым.
Бонус:
Технически, все файлы – это жесткие ссылки. Таким образом, вы действительно ищете файлы с более чем одной жесткой ссылкой.
используйте finddupe:
finddupe -listlink c:\photos
Простой способ для разовых проверок: Изменяются ли атрибуты файла вместе?
Если вы хотите проверить, являются ли файлы A
и B
жесткими ссылками на одно и то же содержимое и не хотите ничего устанавливать или запускать, откройте окно Свойства файла A
и переключите, например, его атрибут Только для чтения. Теперь откройте окно Свойства файла B
, чтобы увидеть, произошло ли изменение атрибута (файла A
) и здесь. Если да, то ответ положительный.
Почему это работает? Потому что связанные жесткие ссылки разделяют одну и ту же группу атрибутов файла и временных меток.
Сказав это, тот же тест можно сделать с временными метками файлов, но их нельзя изменить так же легко, как флаг Только для чтения, чтобы выполнить проверку.
Я написал программу, которая ищет в каталоге, возможна рекурсия, любые виды ссылок. Она может выводить на stdout или как таблицу с разделителем табуляции (tsv) для чтения в Excel/Libreoffice.
Исходный код можно найти в моем репозитории на Github JavaScriptDude/find_links
find_links - Находит любые виды ссылок в Windows
Usage: find_links -p <path> [-r] [-x] [-t] [-f <filter>]
-path | -p: Путь для поиска (обязательный)
-recurse | -r: Рекурсивный поиск
-exec | -x: Открыть tsv, используя проводник
-tsv | -t: Вывод в формате tsv (с разделителем табуляции)
-filter | -f: Фильтровать цель с использованием необязательных шаблонов напр. *foo*
Нет необходимости что-либо скачивать.
Вы можете перейти в нужную папку и выполнить рекурсивный поиск:
echo off & for /F "delims=" %A in ('dir /s /b') do echo. & fsutil hardlink list "%A"
Один одиночный строка означает, что это обычный файл
Две соседние строки означают, что это Жесткая Ссылка.
Это работает в Windows 10, а также в 11, загрузки не требуются.
Основная идея – использовать командную строку (рекомендуется от администратора)
Перейдите в папку, которую вы хотите проверить.
Выполните эту команду, чтобы перечислить ВСЕ ФАЙЛЫ в папке и подпапках, поэтому не делайте все сразу на большом диске. Как отмечено ниже, файлы с жесткими ссылками появятся дважды.
echo off & for /F “delims=” %A in (‘dir /s /b’) do echo. & fsutil hardlink list “%A” > “%UserProfile%\Desktop\HardLinks.txt”
Один одиночный строка означает, что это обычный файл. Можно игнорировать это.
Две строки вместе означают, что это жесткая ссылка.
Верхний путь – для жесткой ссылки, а нижний – для ее исходного источника.
Первая часть статьи обсуждает перечисление символических ссылок и точек соединения.
Ссылка:
https://www.elevenforum.com/t/find-all-symbolic-links-and-junction-points-in-windows.4225/
Я сейчас занят налогами, но думаю, было бы довольно просто написать простой скрипт для удаления дублирующих записей и вывода только жестких ссылок. Может быть, я попрошу сына.
В Windows 11 я просто открываю папку, содержащую эту жесткую ссылку, и запускаю команду dir
. Это все. Смотрите на результат. В моем случае это папка PostgreSQL pg_tblspc
. PostgreSQL хранит здесь жесткие ссылки на таблицы:
C:\PostgreSQL\9.5\data\pg_tblspc>dir
Volume in drive C has no label.
Volume Serial Number is 10B4-2DC6
Directory of C:\PostgreSQL\9.5\data\pg_tblspc
23/04/2019 07:34 AM <DIR> .
11/02/2025 06:54 PM <DIR> ..
23/04/2019 07:09 AM <JUNCTION> 134931 [\??\C:\PostgreSQL\9.5\shadb]
23/04/2019 07:34 AM <JUNCTION> 134990 [\??\C:\PostgreSQL\9.5\nlp]
23/04/2019 05:28 AM <JUNCTION> 16395 [\??\C:\PostgreSQL\9.5\data\balancedb]
23/04/2019 06:37 AM <JUNCTION> 16615 [\??\C:\PostgreSQL\9.5\data\idrakdb]
.
Ответ или решение
Обнаружение жестких ссылок в операционной системе Windows может оказаться непростой задачей для пользователя, особенно если речь идет о старых версиях, таких как Windows 7. Жесткие ссылки фактически являются частью файловой системы NTFS и позволяют нескольким файловым именам ссылаться на один и тот же набор данных на диске. Это особенно удобно для экономии дискового пространства, но усложняет их идентификацию: в проводнике Windows все файлы выглядят одинаково, и команда "dir" также не показывает никаких отличий.
Теория
Жесткая ссылка – это по сути дополнительное имя для файла. В отличие от символических ссылок, которые указывают на другой файл с другого пути, жесткие ссылки создаются на уровне файловой системы и делят один и тот же идентификатор файловых данных (inode) в системе NTFS. Это означает, что изменения, сделанные в одном файле, автоматически применяются ко всем жестким ссылкам этого файла.
Проблема заключается в том, что визуально и в большинстве командной строки Windows нет разницы между оригинальным файлом и его жесткой ссылкой. Для поиска таких ссылок необходимо воспользоваться инструментами, которые позволяют отображать количество ссылок на файл.
Примеры
-
Использование команды fsutil: В Windows 7 и более поздних версиях вы можете использовать команду
fsutil hardlink list <имя_файла>
для отображения всех жестких ссылок, связанных с конкретным файлом. Эта команда покажет все пути, которые ссылаются на тот же набор данных на диске.fsutil hardlink list MyFileName.txt
-
Эксплуатация Windows Subsystem for Linux (WSL): Для тех, кто установил WSL, команда из UNIX, такая как
find
, может использоваться для поиска файлов с более чем одной ссылкой. Запустите терминал Linux, переходите к нужному каталогу и используйте команду:find . -links +1
Эта команда выведет все файлы в текущем каталоге и подкаталогах с количеством ссылок более одной.
-
Link Shell Extension: Существует удобное расширение для проводника Windows под названием Link Shell Extension, которое визуально выделяет файлы, имеющие жесткие ссылки, с помощью особых значков. Это расширение также позволяет создавать жесткие ссылки, символические ссылки и соединения через контекстное меню проводника.
-
Скрипты и утилиты: Некоторые пользователи разрабатывают собственные скрипты для поиска жестких ссылок. Один из таких примеров – скрипт
find_links
, который доступен на платформе GitHub и позволяет искать все виды ссылок в заданной директории.find_links -p <path> [-r] [-x] [-t] [-f <filter>]
Этот скрипт может форматировать вывод в удобном для чтения виде и предоставляет возможность фильтрации.
-
Проверка через атрибуты: Если вы хотите проверить, являются ли два файла жесткими ссылками на один и тот же файл, вы можете изменить атрибуты одного файла, например, флаг "только для чтения", а затем проверить другой файл на предмет изменения. Если изменения атрибутов видны и во втором файле, это указывает на жесткую ссылку.
Применение
Чтобы эффективно управлять жесткими ссылками в Windows, важно изначально учитывать их особенности при создании и записи данных. Например, если жесткие ссылки используются для резервного копирования данных, убедитесь, что файлы остаются доступными и все ссылки остаются актуальными.
Специалисты ИТ, отвечающие за управление системами и резервное копирование, могут воспользоваться этими инструментами для аудита и управления ссылками, что способствует более эффективному использованию ресурсов диска и упрощает управление большими объемами данных.
Таким образом, зная о возможностях и инструментах для работы с жесткими ссылками в Windows, можно значительно упростить процедуру их поиска и анализа, минимизировав возможность ошибок в управлении файлами и резервными копиями.