Страница 1 из 2

[script request] Преобразуем дубликаты в ссылки NTFS

Добавлено: Вт июн 30, 2009 06:51
DrShark
В настоящий момент для TC уже есть автоматизатор сжатия фавйлов средствами NTFS, но эта файловая система даёт нам больше возможностей для экономии места. Удаление дубликатов не всегда приемлемо и здесь нас могут вырчуить жёсткие (а на ОС Windows Vista и выше - также символические) ссылки. Дело в том, что ссылка на файл не обязана иметь тоже имя, что и оригинал. Теперь вспомним о том, что при удалении одной ссылки другие копии остаются нетронутыми. так что работа с ними вполне безопасна.

Идея следующая:
- средствами тотала находим на диске дубликаты
- файлы на панель, выделяем нужные файлы
- запускаем (например, кнопкой) скрипт.

Алгоритм скрипта:
- считает контрольные суммы выделенных файлов
или берёт из колонки (как это может делать DupSelector)
- если у файла есть дубликат с аналогичной контрольной суммой, то
а) проверяет, является ли он жёсткой ссылкой. Если да, идём к следующему дубликату.
б) если файл не является жёсткой ссылкой, один из файлов удаляется и на его местке появляется жёсткая ссылка с именем удалённого файла.
Таким образов, вместо удаления дубликатов мы конвертируем их в жёсткие ссылки, тем самым экономим место на диске.

Естественно, это будет работать в пределах одного диска,
но для висты и выше можно предусмотреть конвертирование дубликата в символическую ссылку (там есть свои ньюансы, по-этому реализация этого функционала фторостепенна).

Вопрос гуру скриптинга, насколько реально реализовать такое средствами VBScript/PowerPro?

Приветствуются любые идеи идеи по автоматизации процесса, в т.ч. средствами внешних утилит или написание спец. плагина. В общем, не обязательно ограничиваться скриптами.

Добавлено: Вт июн 30, 2009 12:33
CaptainFlint
DrShark писал(а):так что работа с ними вполне безопасна.
Тут есть тонкий момент: главное потом при работе с файлом не забыть, что это не копия, а ссылка. А то так начнёшь править файл, забыв, что вместе с файлом одновременно правится и забэкапленная копия…

А вообще что-то мне такое попадалось уже на просторах Интернета, хотя в упор не помню, где и что это было. Кажется, какая-то из прожек удаления дубликатов таким функционалом обладала.

Добавлено: Вт июн 30, 2009 14:32
DrShark
CaptainFlint писал(а):
DrShark писал(а):так что работа с ними вполне безопасна.
Тут есть тонкий момент: главное потом при работе с файлом не забыть, что это не копия, а ссылка. А то так начнёшь править файл, забыв, что вместе с файлом одновременно правится и забэкапленная копия…
Да, согласен, по-этому создание таких ссылок-клонов применимо скорее для нередактируемых форматов типа *.exe. Ну и ещё надо быть внимательным с файлами, которые содержат потоки NTFS (помимо стандартных) - думаю, их по умолчанию не стоит рассматривать как копии и удалять только после предупреждения...

Добавлено: Вт июн 30, 2009 15:16
Batya
DrShark писал(а):проверяет, является ли он жёсткой ссылкой.
CaptainFlint
Насколько я помню, ты говорил, что такая фраза не совсем корректна? С равной долей правомочности можно сказать, что и первоначальный файл является жесткой ссылкой?

Добавлено: Вт июн 30, 2009 17:16
DrShark
Batya писал(а):
DrShark писал(а):проверяет, является ли он жёсткой ссылкой.
CaptainFlint
Насколько я помню, ты говорил, что такая фраза не совсем корректна? С равной долей правомочности можно сказать, что и первоначальный файл является жесткой ссылкой?
Да, т.е. если для файла создать жёсткую ссылку, то ссылками станут оба файла. Т.е. для жёстких ссылок нет понятий "родитель"-"преемник", в отличии от junctions или symlinks.

Добавлено: Вт июн 30, 2009 18:43
Batya
DrShark писал(а):проверяет, является ли он жёсткой ссылкой.
Соответственно, данный пункт надо переиначить - "проверяет, что количество жёстких ссылок больше 1".
А вот теперь, может кто-нибудь даст мысль, как это сделать на vbs?

Добавлено: Вт июн 30, 2009 19:52
DrShark
Batya писал(а):
DrShark писал(а):проверяет, является ли он жёсткой ссылкой.
Соответственно, данный пункт надо переиначить - "проверяет, что количество жёстких ссылок больше 1".
Да, если ссылка 1, то можно считать, что их нет :), а если минимум 2, то есть (кстати, плагин NL_Info считает их по такому же принципу).
А вот теперь, может кто-нибудь даст мысль, как это сделать на vbs?
Можно воспользоваться утилитой ln c ключём -l.
Тут есть ещё пример для работы с ссылками и потоками на vbs.

Добавлено: Вт июн 30, 2009 21:05
CaptainFlint
Batya писал(а):Соответственно, данный пункт надо переиначить - "проверяет, что количество жёстких ссылок больше 1".
Не совсем так. Может получиться, что на диске есть два файла-дубликата, каждый из которых имеет более одной ссылки в файловой системе. Тогда такой подход их проигнорирует, хотя один из файлов можно было бы удалить, заменив все его ссылки ссылками на другой файл. На самом деле, более правильно было бы сравнивать не количество жёстких ссылок, а идентификаторы записей файловой системы (иноды, если использовать никсовую терминологию, не знаю, как оно в виндах официально называется).

Добавлено: Вт июн 30, 2009 21:26
DrShark
CaptainFlint писал(а):На самом деле, более правильно было бы сравнивать не количество жёстких ссылок, а идентификаторы записей файловой системы (иноды, если использовать никсовую терминологию, не знаю, как оно в виндах официально называется).
С использованием утилиты ln в идентификаторах нет необходимости - вышеуказанный ключ -l на WinXP выводит полные пути к файлам-ссылкам.

Добавлено: Вт июн 30, 2009 22:49
Batya
CaptainFlint писал(а):Не совсем так.
Вообщем, да.
Нужно из группы дубликатов выделить один из файлов с максимальным количеством жестких ссылок. Сразу убрать из рассмотрения файлы, которые являются ссылками того же файла. Далее обработать остальные файлы, удалив дубликаты и заменив их жесткими ссылками на выбранный файл. Это всё технические детали.
Основная проблема - как мне загнать в скрипте вычисление количества жестких ссылок в переменную? А также - результат сравнения, являются ли файлы жесткими ссылками одного и того же файла?

Добавлено: Вт июн 30, 2009 23:49
DrShark
CaptainFlint писал(а):Может получиться, что на диске есть два файла-дубликата, каждый из которых имеет более одной ссылки в файловой системе. Тогда такой подход их проигнорирует, хотя один из файлов можно было бы удалить, заменив все его ссылки ссылками на другой файл.
Кстати, это довольно сильно усложняет задачу. Тогда надо парсить список ссылок для каждого файла-ссылки и много сравнивать... Может, для начала всё же оставить уже существующие файлы-ссылки (2 и более экземпляров) в покое, и если найдётся приемлемое решение, добавить их удаление в качестве опции...
Batya писал(а):А также - результат сравнения, являются ли файлы жесткими ссылками одного и того же файла?
ИМХО, парсить вывод ln -l для каждого файла-ссылки и искать различия. В общем, непростая ситуация...

Добавлено: Ср июл 01, 2009 11:39
Batya
В настоящий момент могу создать скрипт тупо пересоздающий жесткие ссылки при каждом его запуске. При этом могу сохранять имена, даты и атрибуты исходных файлов. Потоки NTFS - не ко мне.

Добавлено: Пт июл 03, 2009 14:48
DrShark
Batya писал(а):В настоящий момент могу создать скрипт тупо пересоздающий жесткие ссылки при каждом его запуске. При этом могу сохранять имена, даты и атрибуты исходных файлов. Потоки NTFS - не ко мне.
А идентичность файлов как определяться будет? Сам плагин по контрольным суммам, которые будет считать скрипт, или по колонке плагина в Тотале? Если возможно, второй вариант предпочтительнее (можно оба на выбор)...

Добавлено: Пт июл 03, 2009 18:23
Batya
DrShark
Контрольную сумму (md5) будет считать скрипт. Это не проблема. Проблема - уже для выявленных дубликатов проверять, является ли файл жёсткой ссылкой (есть ли у реальной области на диске, соответствующей файлу, более одной ссылки на неё). Проще удалять (не глядя, файл это или жёсткая ссылка) и создавать новую жёсткую ссылку.

Добавлено: Пт июл 03, 2009 21:11
DrShark
Batya писал(а):Проблема - уже для выявленных дубликатов проверять, является ли файл жёсткой ссылкой (есть ли у реальной области на диске, соответствующей файлу, более одной ссылки на неё).
А утилита ln, которую я предлагал, для этой задачи разве не подходит?