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

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

Добавлено: Ср янв 26, 2011 07:48
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\ имеют свойство регулярно добавляться и добавляться. Тогда как единый файл позволяет проверить хеши всех файлов сразу (или сравнить хеши с содержимым другой папки с аналогичным содержимым), а не делать это по одной папке за раз.

Добавлено: Ср янв 26, 2011 12:23
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

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

P.S. Есть маленькая проблемка - если название папки или файла md5 содержат символ '&', то выдается ошибка и соответствующие файлы или папки не обрабатываются.

Добавлено: Чт янв 27, 2011 02:31
Tol!k
Исправил

Добавлено: Чт янв 27, 2011 14:21
Jonmey
Tol!k
Работает отлично!
Большое спасибо!

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