Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

[script request] Преобразуем дубликаты в ссылки NTFS
Goto page 1, 2  Next
 
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
DrShark



Joined: 21 Oct 2006
Posts: 910
Location: Kyiv, Ukraine

Post (Separately) Posted: Tue Jun 30, 2009 06:51    Post subject: [script request] Преобразуем дубликаты в ссылки NTFS Reply with quote

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

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

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

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

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

Приветствуются любые идеи идеи по автоматизации процесса, в т.ч. средствами внешних утилит или написание спец. плагина. В общем, не обязательно ограничиваться скриптами.
Back to top
View user's profile Send private message
CaptainFlint



Joined: 14 Dec 2004
Posts: 6041
Location: Москва

Post (Separately) Posted: Tue Jun 30, 2009 12:33    Post subject: Reply with quote

DrShark wrote:
так что работа с ними вполне безопасна.

Тут есть тонкий момент: главное потом при работе с файлом не забыть, что это не копия, а ссылка. А то так начнёшь править файл, забыв, что вместе с файлом одновременно правится и забэкапленная копия…

А вообще что-то мне такое попадалось уже на просторах Интернета, хотя в упор не помню, где и что это было. Кажется, какая-то из прожек удаления дубликатов таким функционалом обладала.
_________________
Почему же, ё-моё, ты нигде не пишешь "ё"?
Back to top
View user's profile Send private message
DrShark



Joined: 21 Oct 2006
Posts: 910
Location: Kyiv, Ukraine

Post (Separately) Posted: Tue Jun 30, 2009 14:32    Post subject: Reply with quote

CaptainFlint wrote:
DrShark wrote:
так что работа с ними вполне безопасна.
Тут есть тонкий момент: главное потом при работе с файлом не забыть, что это не копия, а ссылка. А то так начнёшь править файл, забыв, что вместе с файлом одновременно правится и забэкапленная копия…
Да, согласен, по-этому создание таких ссылок-клонов применимо скорее для нередактируемых форматов типа *.exe. Ну и ещё надо быть внимательным с файлами, которые содержат потоки NTFS (помимо стандартных) - думаю, их по умолчанию не стоит рассматривать как копии и удалять только после предупреждения...
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2204
Location: Москва, Россия

Post (Separately) Posted: Tue Jun 30, 2009 15:16    Post subject: Reply with quote

DrShark wrote:
проверяет, является ли он жёсткой ссылкой.

CaptainFlint
Насколько я помню, ты говорил, что такая фраза не совсем корректна? С равной долей правомочности можно сказать, что и первоначальный файл является жесткой ссылкой?
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
DrShark



Joined: 21 Oct 2006
Posts: 910
Location: Kyiv, Ukraine

Post (Separately) Posted: Tue Jun 30, 2009 17:16    Post subject: Reply with quote

Batya wrote:
DrShark wrote:
проверяет, является ли он жёсткой ссылкой.

CaptainFlint
Насколько я помню, ты говорил, что такая фраза не совсем корректна? С равной долей правомочности можно сказать, что и первоначальный файл является жесткой ссылкой?
Да, т.е. если для файла создать жёсткую ссылку, то ссылками станут оба файла. Т.е. для жёстких ссылок нет понятий "родитель"-"преемник", в отличии от junctions или symlinks.
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2204
Location: Москва, Россия

Post (Separately) Posted: Tue Jun 30, 2009 18:43    Post subject: Reply with quote

DrShark wrote:
проверяет, является ли он жёсткой ссылкой.

Соответственно, данный пункт надо переиначить - "проверяет, что количество жёстких ссылок больше 1".
А вот теперь, может кто-нибудь даст мысль, как это сделать на vbs?
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
DrShark



Joined: 21 Oct 2006
Posts: 910
Location: Kyiv, Ukraine

Post (Separately) Posted: Tue Jun 30, 2009 19:52    Post subject: Reply with quote

Batya wrote:
DrShark wrote:
проверяет, является ли он жёсткой ссылкой.

Соответственно, данный пункт надо переиначить - "проверяет, что количество жёстких ссылок больше 1".
Да, если ссылка 1, то можно считать, что их нет Smile, а если минимум 2, то есть (кстати, плагин NL_Info считает их по такому же принципу).
Quote:
А вот теперь, может кто-нибудь даст мысль, как это сделать на vbs?
Можно воспользоваться утилитой ln c ключём -l.
Тут есть ещё пример для работы с ссылками и потоками на vbs.
Back to top
View user's profile Send private message
CaptainFlint



Joined: 14 Dec 2004
Posts: 6041
Location: Москва

Post (Separately) Posted: Tue Jun 30, 2009 21:05    Post subject: Reply with quote

Batya wrote:
Соответственно, данный пункт надо переиначить - "проверяет, что количество жёстких ссылок больше 1".

Не совсем так. Может получиться, что на диске есть два файла-дубликата, каждый из которых имеет более одной ссылки в файловой системе. Тогда такой подход их проигнорирует, хотя один из файлов можно было бы удалить, заменив все его ссылки ссылками на другой файл. На самом деле, более правильно было бы сравнивать не количество жёстких ссылок, а идентификаторы записей файловой системы (иноды, если использовать никсовую терминологию, не знаю, как оно в виндах официально называется).
_________________
Почему же, ё-моё, ты нигде не пишешь "ё"?
Back to top
View user's profile Send private message
DrShark



Joined: 21 Oct 2006
Posts: 910
Location: Kyiv, Ukraine

Post (Separately) Posted: Tue Jun 30, 2009 21:26    Post subject: Reply with quote

CaptainFlint wrote:
На самом деле, более правильно было бы сравнивать не количество жёстких ссылок, а идентификаторы записей файловой системы (иноды, если использовать никсовую терминологию, не знаю, как оно в виндах официально называется).
С использованием утилиты ln в идентификаторах нет необходимости - вышеуказанный ключ -l на WinXP выводит полные пути к файлам-ссылкам.
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2204
Location: Москва, Россия

Post (Separately) Posted: Tue Jun 30, 2009 22:49    Post subject: Reply with quote

CaptainFlint wrote:
Не совсем так.

Вообщем, да.
Нужно из группы дубликатов выделить один из файлов с максимальным количеством жестких ссылок. Сразу убрать из рассмотрения файлы, которые являются ссылками того же файла. Далее обработать остальные файлы, удалив дубликаты и заменив их жесткими ссылками на выбранный файл. Это всё технические детали.
Основная проблема - как мне загнать в скрипте вычисление количества жестких ссылок в переменную? А также - результат сравнения, являются ли файлы жесткими ссылками одного и того же файла?
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
DrShark



Joined: 21 Oct 2006
Posts: 910
Location: Kyiv, Ukraine

Post (Separately) Posted: Tue Jun 30, 2009 23:49    Post subject: Reply with quote

CaptainFlint wrote:
Может получиться, что на диске есть два файла-дубликата, каждый из которых имеет более одной ссылки в файловой системе. Тогда такой подход их проигнорирует, хотя один из файлов можно было бы удалить, заменив все его ссылки ссылками на другой файл.
Кстати, это довольно сильно усложняет задачу. Тогда надо парсить список ссылок для каждого файла-ссылки и много сравнивать... Может, для начала всё же оставить уже существующие файлы-ссылки (2 и более экземпляров) в покое, и если найдётся приемлемое решение, добавить их удаление в качестве опции...
Batya wrote:
А также - результат сравнения, являются ли файлы жесткими ссылками одного и того же файла?
ИМХО, парсить вывод ln -l для каждого файла-ссылки и искать различия. В общем, непростая ситуация...
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2204
Location: Москва, Россия

Post (Separately) Posted: Wed Jul 01, 2009 11:39    Post subject: Reply with quote

В настоящий момент могу создать скрипт тупо пересоздающий жесткие ссылки при каждом его запуске. При этом могу сохранять имена, даты и атрибуты исходных файлов. Потоки NTFS - не ко мне.
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
DrShark



Joined: 21 Oct 2006
Posts: 910
Location: Kyiv, Ukraine

Post (Separately) Posted: Fri Jul 03, 2009 14:48    Post subject: Reply with quote

Batya wrote:
В настоящий момент могу создать скрипт тупо пересоздающий жесткие ссылки при каждом его запуске. При этом могу сохранять имена, даты и атрибуты исходных файлов. Потоки NTFS - не ко мне.
А идентичность файлов как определяться будет? Сам плагин по контрольным суммам, которые будет считать скрипт, или по колонке плагина в Тотале? Если возможно, второй вариант предпочтительнее (можно оба на выбор)...
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2204
Location: Москва, Россия

Post (Separately) Posted: Fri Jul 03, 2009 18:23    Post subject: Reply with quote

DrShark
Контрольную сумму (md5) будет считать скрипт. Это не проблема. Проблема - уже для выявленных дубликатов проверять, является ли файл жёсткой ссылкой (есть ли у реальной области на диске, соответствующей файлу, более одной ссылки на неё). Проще удалять (не глядя, файл это или жёсткая ссылка) и создавать новую жёсткую ссылку.
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
DrShark



Joined: 21 Oct 2006
Posts: 910
Location: Kyiv, Ukraine

Post (Separately) Posted: Fri Jul 03, 2009 21:11    Post subject: Reply with quote

Batya wrote:
Проблема - уже для выявленных дубликатов проверять, является ли файл жёсткой ссылкой (есть ли у реальной области на диске, соответствующей файлу, более одной ссылки на неё).
А утилита ln, которую я предлагал, для этой задачи разве не подходит?
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander All times are GMT + 4 Hours
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group