IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Обсуждение программ (http://www.imho.ws/forumdisplay.php?f=3)
-   -   Сравнение файлов в папках (http://www.imho.ws/showthread.php?t=147154)

Bayer 31.07.2012 17:20

Сравнение файлов в папках
 
Приветствую всех! Ищу оптимальное решение для сравнения файлов в папках по заданным параметрам.

Задача: сравнить большое количество файлов с одинаковыми именами, но с разными расширениями, с разными размерами, в разных директориях, на разных разделах с целью последующей синхронизации этих файлов, причём, в обе стороны - т.е. копирование недостающих или удаление "лишних".

Вопрос: какой посоветуете для этой цели файл-менеджер оптимально?
Никакие прочие навороты и фишки не нужны вовсе.

На всякий случай поясню суть: в архиве есть папка с необработанными RAW(NEF)-файлами и другая папка с обработанными JPEG-файлами на оперативном разделе диска. Чтобы освободить архив от отбракованных и удалённых в процессе обработки файлов, нужно сделать сравнение двух папок по именам файлов и оставшиеся удалить.

Borland 31.07.2012 18:38

Есть всего 2 файл-менеджера, не считая Windows Explorer. :gigi:
Оба для поставленной задачи одинаково мало подходят, насколь я в курсе (TC не пользуюсь).
Я лично обошёлся бы написанием скрипта/комплекта .cmd-скриптов.
К примеру, чистка папки с исходниками (как я понял Вашу задачу):
Код:

REM задаём рабочие папки
set "RAWDIR=d:\RAWDIR"
set "JPEGDIR=e:\Jpegdir"

REM Проверка существования и доступности папок
pushd "%RAWDIR%" ||exit
pushd "%JPEGDIR%" && popd || exit

REM Удаляем из RAW-папки файлы, для которых нет соответствующего
REM (с таким же именем) файла в JPEG-папке
for /f "delims=" %%N in ('dir /b *.raw') do call :check "%%N"
popd
goto :EOF

:check
if not exist "%JPEGDIR%\%~n1.jpeg" del /q "%1"
goto :EOF

Синхронизация - команды xcopy, robocopy и многое другое. С написанием скриптов поможем, если вы чётко сформулируете алгоритмы - что по каким критериям сравнивать и копировать.

Bayer 31.07.2012 20:24

Цитата:

Сообщение от Borland (Сообщение 1762621)
С написанием скриптов поможем, если вы чётко сформулируете алгоритмы - что по каким критериям сравнивать и копировать.

Подход серьёзный, я ожидал чего-то попроще, спасибо :yees:

Со скриптами понятно, а есть ли решение на основе графического интерфейса? Я, почему-то, был уверен, что с описанной задачей легко справляется какой-либо файл-менеджер, типа ТС или Far'a, только мне до сих пор не известно, каким образом.

А как ещё чётче сформулировать алгоритм, я не очень представляю...
1. Есть архивный ЖД с директориями сортированных по дате съёмок вида YYYY.MM.DD Name_of_Event, куда сливается сырой материал сразу после съёмки.
2. Есть оперативный ЖД с точно так же сортированными директориями с сырым материалом. Отсюда файлы берутся для обработки.
3. Есть оперативный ЖД с точно так же сортированными директориями, но уже с готовым, обработанным материалом.

По результатам обработки, я хочу удалить с архивного ЖД, из актуальной в данный момент директории те файлы, которые были удалены в процессе обработки с оперативного ЖД, т.е. те, которых нет в директории с готовым, обработанным материалом.

Пример:
- сравнить папки X:\YYYY.MM.DD Name_of_Event\с файлами *.NEF и Z:\YYYY.MM.DD Name_of_Event\с файлами *.JPG только по именам файлов, без учёта всех прочих параметров.
- автоматически выделить разницу, т.е. те файлы (NEF), которых нет в конечной папке (JPG)

Далее - удаление автоматически или в ручную, не существенно.

В ТС или Far'е есть такая возможность или там только сравнение файлов идентичных по типу?

Borland 31.07.2012 20:49

Цитата:

Сообщение от Bayer (Сообщение 1762626)
В ТС или Far'е есть такая возможность или там только сравнение файлов идентичных по типу?

Там сравнение с учётом типа. Точнее - полного имени файла (имя+расширение). Т.е. объяснить ему, что jpeg и nef это одно и то же - не удастся, без вариантов (насколько мне известно).
Цитата:

Сообщение от Bayer (Сообщение 1762626)
Пример:...

Ну, я так и понял.
Адаптация скрипта выше под конкретный пример:
Код:

REM задаём рабочие папки
set "RAWDIR=X:\YYYY.MM.DD Name_of_Event"
set "JPEGDIR=Z:\YYYY.MM.DD Name_of_Event"

REM Проверка существования и доступности папок
pushd "%RAWDIR%" ||exit
pushd "%JPEGDIR%" && popd || exit

REM Удаляем из RAW-папки файлы, для которых нет соответствующего
REM (с таким же именем) файла в JPEG-папке
for /f "delims=" %%N in ('dir /b *.nef') do call :check "%%N"
popd
goto :EOF

:check
if not exist "%JPEGDIR%\%~n1.jpg" del /q "%1"
goto :EOF

Чисто технически - можно сделать рекурсивный обход папок на диске с сравнением с такими же папками на другом диске. Тогда не надо будет, с одной стророны, для каждой пары папок прописывать имена в сам батник - но будут лопатиться все папки что попадутся, что обычно не требуется...
На всякий - в редакторе Far Manager есть очень удобная фишка: вставка по "Ctrl-Shift-[" текущего пути в активной вкладке и по "Ctrl-Shift-]" текущего пути в неактивной вкладке (это к вопросу о редактировании имён папок). Причём в любой момент можно переключиться из редактора на панели (по Ctrl-tab) и обратно. ;)
Да, на всякий - скрипт ничего не спрашивает и не помечает, он именно удаляет, сразу и не задавая вопросов. Именно потому в него и вставлена проверка на доступность обоих заданных папок, и безусловное прекращение выполнения при недоступности любой из них.

Bayer 01.08.2012 14:18

Borland, правильно ли я понял, что от меня требуется лишь менять пути X:\YYYY.MM.DD Name_of_Event и Z:\YYYY.MM.DD Name_of_Event ? Ничего другого менять не нужно?

Borland 01.08.2012 15:35

Правильно.
Разве что захочется приспособить для других пар файлов (вместо nef/jpg, к примеру, raw/png) - тогда надо будет ещё и расширения поменять в 11-й и 16-й строках соответственно.

Bayer 01.08.2012 15:56

Borland, спасибо! Попробую и отпишу о результате.

UPD.
Полевые испытания прошли успешно, на данный момент освобождено свыше 20 ГБ дискового пространства.
Ещё раз большое спасибо!

Напрягает, разве что, ручное вбивание путей папок, вот если бы можно было просто выбирать их, как в окнах файл-менеджера...
Возможно ли в будущем придать этому скрипту граф. фейс? Мне кажется, прога была бы востребована среди фотографов.

Borland 01.08.2012 20:11

Цитата:

Сообщение от Bayer (Сообщение 1762640)
Возможно ли

"Невозможное возможно если верить в чудеса" :biggrin:
Можно прикрутить к менюхе Far Manager команду "обработать отмеченные папки".
process.cmd
Код:

set "RAWDISK=X:\"
set "JPGDISK=Y:\"
if /I "%CD%" neq "%RAWDISK%" exit

pushd "%RAWDISK%%~1" ||exit
pushd "%JPGDISK%%~1" && popd || exit

for /f "delims=" %%N in ('dir /b *.nef') do call :check "%%N" "%~1"
set "RAWDISK="
set "JPGDISK="
popd
goto :EOF

:check
if not exist "%JPGDISK%%~2\%~n1.jpg" del /q "%~1"
goto :EOF

Кладём его в корень (очищаемого) диска с RAW-файлами.
Рядом кладём farmenu.ini
Код:

C:  Compare&Clean
    for /f "delims=" %A in (!@!) do call process.cmd "%~A"

В .cmd меняем соответственно буквы дисков (обязательно в верхнем регистре).
Дальше можно вызывать process.cmd непосредственно в формате
Код:

process.cmd "Имя обрабатываемой папки"
(На всякий - в FAR вставка в командную строку имени текущего объекта под курсором делается по Ctrl-Enter).

Либо помечаем в панели FAR папки для обработки (на RAW-диске), вызываем меню FAR (кнопкой F2), выбираем пункт "Compare&Clean" и ждём пока остынет. :gigi:

Этот же process.cmd технически несложно прикрутить и в контекстное меню того же Win Explorer, но ТАКОГО я лично делать не собираюсь и другим не советую. Это не программа, это скрипт...;)

В этом варианте требуется точное совпадение имён проверяемых папок с RAW и JPG и их нахождение в корне соответствующих дисков.

Писать под это программу - неинтересно. Она будет либо существенно сложнее чем кажется - либо никому, по большому счёту, не потребуется...

P.S. Совсем уже хак :gigi: - вывод команд обработки можно перенаправить в встроенный редактор FAR, слегка изменив farmenu.ini:
Код:

C:  Compare&Clean
    edit: <for /f "delims=" %A in (!@!) do call process.cmd "%~A"

:gigi:

FiL 02.08.2012 07:18

Можно плагин для фара написать.
Такой уже есть ( http://plugring.farmanager.com/plugin.php?pid=19&l=ru ), но он под старый фар.

P.S. Я не тестировал, так что ответственности не несу.

Borland 02.08.2012 12:32

Цитата:

Сообщение от FiL (Сообщение 1762664)
Можно плагин для фара написать.

Это не проще, чем программу. :biggrin:

Цитата:

Сообщение от FiL (Сообщение 1762664)
он под старый фар

Под линейкой 1.x должен работать как минимум до версии 1.70.

Но, ИМХО, скрипты проще в применении и гибче. :gigi:

grom1300 14.11.2012 18:38

я решил проблему следующим образом:

total commander 8.01
обработанные jpg слева, исходники справа
исходники временно переименовываем в jpg : F6 *.jpg
далее
synchronize directories/asymmetric/compare
проверить все, файлы со значком неравно тронуты не будут
далее
synchronize
затем оставшиеся исходники справа переименовываем обратно

Bayer 15.11.2012 00:48

grom1300, это изначально самое предсказуемое, но очень неудобное решение. Скрипт от Borland-а гораздо удобней. На мой взгляд, разумеется.


Часовой пояс GMT +4, время: 10:04.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.