Склеивание текстовых файлов с их редактированием

Обсуждение вопросов автоматизации Total Commander с помощью сторонних программ и скриптовых технологий.

Модераторы: d-view, Моторокер, Avada, CaptainFlint, Nik

Ответить
Jonmey
Сообщения: 59
Зарегистрирован: Пн сен 27, 2010 14:01

Склеивание текстовых файлов с их редактированием

Сообщение Jonmey »

Задача возникла следующего рода.
Имеется каталог вида

Код: Выделить всё

DIR\DIR 1\File 1.ext1
DIR\DIR 1\File 2.ext2
DIR\DIR 1\File 3.md5
DIR\DIR 2\File 1.ext3
DIR\DIR 2\File 2.ext4
DIR\DIR 2\File 3.md5
DIR\DIR 3\File 1.ext6
DIR\DIR 3\File 2.ext7
DIR\DIR 3\File 3.md5
DIR\ПАПКА\Файл 1.ext8
DIR\ПАПКА\Файл 2.ext9
DIR\ПАПКА\Файл 3.md5
То есть, состав файлов в каждой папке разный, но к каждой подпапке (DIR1, DIR2, ...) имеется один файл .md5, в котором содержатся хеши md5 для всех файлов этой папки (включая подпапки) вида

Код: Выделить всё

38ca81f5b9098bff4d3c9bf6a4e53b45  File1.ext1
1b36dcb4b186135d9bd71d82f36ecb0a  File2.ext2
7ac65761628a8b4957a95b1a6f658b80  File3.ext3
(два пробела перед именем файла)
или вида

Код: Выделить всё

38ca81f5b9098bff4d3c9bf6a4e53b45 *File1.ext1
1b36dcb4b186135d9bd71d82f36ecb0a *File2.ext2
7ac65761628a8b4957a95b1a6f658b80 *File3.ext3
Требуется для выбранных папок объединить все md5 файлы, которые в них имеются в один, однако не просто объединить, а прописать относительные или абсолютные пути (в зависимости от целевого расположения объединенного .MD5 файла). То есть, чтобы, в зависимости от места создания целевого файла получался файл вида:

Код: Выделить всё

38ca81f5b9098bff4d3c9bf6a4e53b45  DIR 1\File1.ext1
1b36dcb4b186135d9bd71d82f36ecb0a  DIR 1\File2.ext2
7ac65761628a8b4957a95b1a6f658b80  DIR 1\File3.ext3
38ca81f5b9098bff4d3c9bf6a4e53b45  DIR 2\File1.ext1
1b36dcb4b186135d9bd71d82f36ecb0a  DIR 2\File2.ext2
7ac65761628a8b4957a95b1a6f658b80  DIR\2\File3.ext3
или

Код: Выделить всё

38ca81f5b9098bff4d3c9bf6a4e53b45  X:\DIR\DIR 1\File1.ext1
1b36dcb4b186135d9bd71d82f36ecb0a  X:\DIR\DIR 1\File2.ext2
7ac65761628a8b4957a95b1a6f658b80  X:\DIR\DIR 1\File3.ext3
38ca81f5b9098bff4d3c9bf6a4e53b45  X:\DIR\DIR 2\File1.ext1
1b36dcb4b186135d9bd71d82f36ecb0a  X:\DIR\DIR 2\File2.ext2
7ac65761628a8b4957a95b1a6f658b80  X:\DIR\DIR\2\File3.ext3
Создавать единый файл .MD5 пересчетом хешей не предлагать - это многочаcовой мучительный процесс. А папки \DIR N\ и \ПАПКА N\ имеют свойство регулярно добавляться и добавляться. Тогда как единый файл позволяет проверить хеши всех файлов сразу (или сравнить хеши с содержимым другой папки с аналогичным содержимым), а не делать это по одной папке за раз.
Аватара пользователя
Tol!k
Сообщения: 1727
Зарегистрирован: Вт апр 01, 2008 20:02
Откуда: Арзамас

Сообщение Tol!k »

Код: Выделить всё

@echo off &chcp 1251 >nul
setlocal enableextensions

rem Параметры для TC: %L
set "summa=~folder.md5"

cd. >"%summa%"
cd. >"%summa%.tmp"
for /f "usebackq delims=" %%d in ("%~1") do dir /b/s "%%d*.md5" >>"%summa%.tmp"
for /f "usebackq delims=" %%s in ("%summa%.tmp") do (
  title %%s
  for /f "tokens=1,*" %%f in ('type "%%s"') do call :f %%f "%%g" "%%~dps"
)
del /q "%summa%.tmp"
goto :eof

:f
set "n=%~2"
if "%n:~0,1%"=="*" set "n=%n:~1%"
set "nn=%~3%n%"
>>"%summa%" echo %1  %nn:&=^&%
goto :eof
Последний раз редактировалось Tol!k Чт янв 27, 2011 02:39, всего редактировалось 2 раза.
Jonmey
Сообщения: 59
Зарегистрирован: Пн сен 27, 2010 14:01

Сообщение Jonmey »

Tol!k
Здорово! Вот уж не думал, что эту задачу можно решить с помощью коммандного файла. Снимаю шляпу. Спасибо большое.

P.S. Есть маленькая проблемка - если название папки или файла md5 содержат символ '&', то выдается ошибка и соответствующие файлы или папки не обрабатываются.
Аватара пользователя
Tol!k
Сообщения: 1727
Зарегистрирован: Вт апр 01, 2008 20:02
Откуда: Арзамас

Сообщение Tol!k »

Исправил
Jonmey
Сообщения: 59
Зарегистрирован: Пн сен 27, 2010 14:01

Сообщение Jonmey »

Tol!k
Работает отлично!
Большое спасибо!

P.S. Благодаря скрипту обнаружил 7 неучтенных (непрохешированных) файлов.
Ответить