[script request] Преобразуем дубликаты в ссылки NTFS
Модераторы: Моторокер, Avada, CaptainFlint, Nik, d-view
-
DrShark
- Сообщения: 911
- Зарегистрирован: Сб окт 21, 2006 20:27
- Откуда: Kyiv, Ukraine
- Контактная информация:
[script request] Преобразуем дубликаты в ссылки NTFS
В настоящий момент для TC уже есть автоматизатор сжатия фавйлов средствами NTFS, но эта файловая система даёт нам больше возможностей для экономии места. Удаление дубликатов не всегда приемлемо и здесь нас могут вырчуить жёсткие (а на ОС Windows Vista и выше - также символические) ссылки. Дело в том, что ссылка на файл не обязана иметь тоже имя, что и оригинал. Теперь вспомним о том, что при удалении одной ссылки другие копии остаются нетронутыми. так что работа с ними вполне безопасна.
Идея следующая:
- средствами тотала находим на диске дубликаты
- файлы на панель, выделяем нужные файлы
- запускаем (например, кнопкой) скрипт.
Алгоритм скрипта:
- считает контрольные суммы выделенных файлов
или берёт из колонки (как это может делать DupSelector)
- если у файла есть дубликат с аналогичной контрольной суммой, то
а) проверяет, является ли он жёсткой ссылкой. Если да, идём к следующему дубликату.
б) если файл не является жёсткой ссылкой, один из файлов удаляется и на его местке появляется жёсткая ссылка с именем удалённого файла.
Таким образов, вместо удаления дубликатов мы конвертируем их в жёсткие ссылки, тем самым экономим место на диске.
Естественно, это будет работать в пределах одного диска,
но для висты и выше можно предусмотреть конвертирование дубликата в символическую ссылку (там есть свои ньюансы, по-этому реализация этого функционала фторостепенна).
Вопрос гуру скриптинга, насколько реально реализовать такое средствами VBScript/PowerPro?
Приветствуются любые идеи идеи по автоматизации процесса, в т.ч. средствами внешних утилит или написание спец. плагина. В общем, не обязательно ограничиваться скриптами.
Идея следующая:
- средствами тотала находим на диске дубликаты
- файлы на панель, выделяем нужные файлы
- запускаем (например, кнопкой) скрипт.
Алгоритм скрипта:
- считает контрольные суммы выделенных файлов
или берёт из колонки (как это может делать DupSelector)
- если у файла есть дубликат с аналогичной контрольной суммой, то
а) проверяет, является ли он жёсткой ссылкой. Если да, идём к следующему дубликату.
б) если файл не является жёсткой ссылкой, один из файлов удаляется и на его местке появляется жёсткая ссылка с именем удалённого файла.
Таким образов, вместо удаления дубликатов мы конвертируем их в жёсткие ссылки, тем самым экономим место на диске.
Естественно, это будет работать в пределах одного диска,
но для висты и выше можно предусмотреть конвертирование дубликата в символическую ссылку (там есть свои ньюансы, по-этому реализация этого функционала фторостепенна).
Вопрос гуру скриптинга, насколько реально реализовать такое средствами VBScript/PowerPro?
Приветствуются любые идеи идеи по автоматизации процесса, в т.ч. средствами внешних утилит или написание спец. плагина. В общем, не обязательно ограничиваться скриптами.
- CaptainFlint
- Сообщения: 6243
- Зарегистрирован: Вт дек 14, 2004 22:34
- Контактная информация:
Тут есть тонкий момент: главное потом при работе с файлом не забыть, что это не копия, а ссылка. А то так начнёшь править файл, забыв, что вместе с файлом одновременно правится и забэкапленная копия…DrShark писал(а):так что работа с ними вполне безопасна.
А вообще что-то мне такое попадалось уже на просторах Интернета, хотя в упор не помню, где и что это было. Кажется, какая-то из прожек удаления дубликатов таким функционалом обладала.
Почему же, ё-моё, ты нигде не пишешь "ё"?
-
DrShark
- Сообщения: 911
- Зарегистрирован: Сб окт 21, 2006 20:27
- Откуда: Kyiv, Ukraine
- Контактная информация:
Да, согласен, по-этому создание таких ссылок-клонов применимо скорее для нередактируемых форматов типа *.exe. Ну и ещё надо быть внимательным с файлами, которые содержат потоки NTFS (помимо стандартных) - думаю, их по умолчанию не стоит рассматривать как копии и удалять только после предупреждения...CaptainFlint писал(а):Тут есть тонкий момент: главное потом при работе с файлом не забыть, что это не копия, а ссылка. А то так начнёшь править файл, забыв, что вместе с файлом одновременно правится и забэкапленная копия…DrShark писал(а):так что работа с ними вполне безопасна.
-
DrShark
- Сообщения: 911
- Зарегистрирован: Сб окт 21, 2006 20:27
- Откуда: Kyiv, Ukraine
- Контактная информация:
Да, т.е. если для файла создать жёсткую ссылку, то ссылками станут оба файла. Т.е. для жёстких ссылок нет понятий "родитель"-"преемник", в отличии от junctions или symlinks.Batya писал(а):CaptainFlintDrShark писал(а):проверяет, является ли он жёсткой ссылкой.
Насколько я помню, ты говорил, что такая фраза не совсем корректна? С равной долей правомочности можно сказать, что и первоначальный файл является жесткой ссылкой?
-
DrShark
- Сообщения: 911
- Зарегистрирован: Сб окт 21, 2006 20:27
- Откуда: Kyiv, Ukraine
- Контактная информация:
Да, если ссылка 1, то можно считать, что их нетBatya писал(а):Соответственно, данный пункт надо переиначить - "проверяет, что количество жёстких ссылок больше 1".DrShark писал(а):проверяет, является ли он жёсткой ссылкой.
Можно воспользоваться утилитой ln c ключём -l.А вот теперь, может кто-нибудь даст мысль, как это сделать на vbs?
Тут есть ещё пример для работы с ссылками и потоками на vbs.
- CaptainFlint
- Сообщения: 6243
- Зарегистрирован: Вт дек 14, 2004 22:34
- Контактная информация:
Не совсем так. Может получиться, что на диске есть два файла-дубликата, каждый из которых имеет более одной ссылки в файловой системе. Тогда такой подход их проигнорирует, хотя один из файлов можно было бы удалить, заменив все его ссылки ссылками на другой файл. На самом деле, более правильно было бы сравнивать не количество жёстких ссылок, а идентификаторы записей файловой системы (иноды, если использовать никсовую терминологию, не знаю, как оно в виндах официально называется).Batya писал(а):Соответственно, данный пункт надо переиначить - "проверяет, что количество жёстких ссылок больше 1".
Почему же, ё-моё, ты нигде не пишешь "ё"?
-
DrShark
- Сообщения: 911
- Зарегистрирован: Сб окт 21, 2006 20:27
- Откуда: Kyiv, Ukraine
- Контактная информация:
С использованием утилиты ln в идентификаторах нет необходимости - вышеуказанный ключ -l на WinXP выводит полные пути к файлам-ссылкам.CaptainFlint писал(а):На самом деле, более правильно было бы сравнивать не количество жёстких ссылок, а идентификаторы записей файловой системы (иноды, если использовать никсовую терминологию, не знаю, как оно в виндах официально называется).
Вообщем, да.CaptainFlint писал(а):Не совсем так.
Нужно из группы дубликатов выделить один из файлов с максимальным количеством жестких ссылок. Сразу убрать из рассмотрения файлы, которые являются ссылками того же файла. Далее обработать остальные файлы, удалив дубликаты и заменив их жесткими ссылками на выбранный файл. Это всё технические детали.
Основная проблема - как мне загнать в скрипте вычисление количества жестких ссылок в переменную? А также - результат сравнения, являются ли файлы жесткими ссылками одного и того же файла?
Нет, я не сплю. Я просто медленно моргаю.
-
DrShark
- Сообщения: 911
- Зарегистрирован: Сб окт 21, 2006 20:27
- Откуда: Kyiv, Ukraine
- Контактная информация:
Кстати, это довольно сильно усложняет задачу. Тогда надо парсить список ссылок для каждого файла-ссылки и много сравнивать... Может, для начала всё же оставить уже существующие файлы-ссылки (2 и более экземпляров) в покое, и если найдётся приемлемое решение, добавить их удаление в качестве опции...CaptainFlint писал(а):Может получиться, что на диске есть два файла-дубликата, каждый из которых имеет более одной ссылки в файловой системе. Тогда такой подход их проигнорирует, хотя один из файлов можно было бы удалить, заменив все его ссылки ссылками на другой файл.
ИМХО, парсить вывод ln -l для каждого файла-ссылки и искать различия. В общем, непростая ситуация...Batya писал(а):А также - результат сравнения, являются ли файлы жесткими ссылками одного и того же файла?
-
DrShark
- Сообщения: 911
- Зарегистрирован: Сб окт 21, 2006 20:27
- Откуда: Kyiv, Ukraine
- Контактная информация:
А идентичность файлов как определяться будет? Сам плагин по контрольным суммам, которые будет считать скрипт, или по колонке плагина в Тотале? Если возможно, второй вариант предпочтительнее (можно оба на выбор)...Batya писал(а):В настоящий момент могу создать скрипт тупо пересоздающий жесткие ссылки при каждом его запуске. При этом могу сохранять имена, даты и атрибуты исходных файлов. Потоки NTFS - не ко мне.
DrShark
Контрольную сумму (md5) будет считать скрипт. Это не проблема. Проблема - уже для выявленных дубликатов проверять, является ли файл жёсткой ссылкой (есть ли у реальной области на диске, соответствующей файлу, более одной ссылки на неё). Проще удалять (не глядя, файл это или жёсткая ссылка) и создавать новую жёсткую ссылку.
Контрольную сумму (md5) будет считать скрипт. Это не проблема. Проблема - уже для выявленных дубликатов проверять, является ли файл жёсткой ссылкой (есть ли у реальной области на диске, соответствующей файлу, более одной ссылки на неё). Проще удалять (не глядя, файл это или жёсткая ссылка) и создавать новую жёсткую ссылку.
Нет, я не сплю. Я просто медленно моргаю.