Группировать файлы из каталога в другой каталог с определенным шаблоном в имени файла - PullRequest
0 голосов
/ 15 января 2019

Итак, у меня есть каталог (D: \ Project \ Archive), содержащий множество файлов .txt с различными шаблонами имен файлов, за исключением последних 9 символов, перед расширением. Я перечисляю вниз 6 имен файлов в качестве примера:

  • 123456_HTQB_1412.txt
  • abcd_GGTL_7642.txt
  • 1a2b3_HTQB_1412.txt
  • pikachu_JTYU_7177.txt
  • hsbhsd_GGTL_7642.txt
  • yt7777_HTQB_7642.txt

Эти файлы в произвольном порядке. Что очевидно, так это то, что последние 9 символов имени файла перед расширением следуют шаблону из 4 символов, за которым следует подчеркивание, за которым следуют 4 цифры. Эти 9 символов будут одинаковыми для нескольких файлов.

Моя цель - архивировать файлы, имеющие одинаковые 9 символов, независимо от количества файлов. Имя zip-файла должно содержать 9 символов с шаблоном, а имена файлов должны быть без этих 9 символов. Приведенный выше пример должен создать 3 архивных файла:

  • HTQB_1412.zip - содержит 123456_.txt, 1a2b3_.txt, yt7777_.txt.
  • GGTL_7642.zip - содержит abcd_.txt, hsbhsd_.txt.
  • JTYU_7177.zip - содержит pikachu_.txt.

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

Проблема, с которой я сталкиваюсь, связана главным образом с группировкой. Хотя логика работает нормально, но с включенным отложенным расширением переменные по-прежнему сохраняют значения даже после перемещения файлов в другой каталог. Это приводит к ненужным накладным расходам, приводящим к сообщениям об ошибках «Файл не найден», когда цикл пытается получить доступ к этим файлам. Есть ли способ сбросить переменные с помощью массивов? Или любой другой подход, который может быть проще, чем тот, который я использую?

Я просто публикую код для операций группировки, потому что, как только это выяснится, я смогу реализовать остальное.

set WORKDIR=D:\Project\Archive
setLocal enableDelayedExpansion
for /f "tokens=*" %%g in ('dir /b %WORKDIR%\*.txt') do (
    set firstFile=%%~ng
    set firstPattern=!firstFile:~-9!
    move /y %WORKDIR%\%%g %WORKDIR%\_toArchive
    call :checkPatterns
)
:checkPatterns
    for /f "tokens=*" %%i in ('dir /b %WORKDIR%\*.txt') do (
        set fileToGroup=%%i
        set groupedFile=%%~ni
        set groupedPattern=!groupedFile:~-9!
        call :groupPatterns
    )
:groupPatterns
    if "%groupedPattern%" == "%firstPattern%" (
        move /y %WORKDIR%\%fileToGroup% %WORKDIR%\_toArchive
    )

1 Ответ

0 голосов
/ 15 января 2019

Предлагаю воспользоваться другим подходом:

  • итерация всех файлов и создание переменной среды (массива) для каждой группы
  • повторять группы и перемещать (или копировать) файлы (с укороченными именами) в группу - папку
  • архивировать файлы внутри папки группы, а затем удалить папку группы

Следующая партия требует, чтобы 7zip был доступен где-то на пути:

:: Q:\Test\2019\01\14\SO_54189436.cmd
@Echo off&SetLocal EnableDelayedExpansion

set WORKDIR=D:\Project\Archive

:: clear Group[] variables
for /f "delims==" %%A in ('Set Group[ 2^>Nul') Do set "%%A="

:: get groups
for /f "tokens=*" %%g in ('dir /b %WORKDIR%\*.txt') do (
    set FileName=%%~ng
    set "Group[!FileName:~-9!]=!FileName:~-9!"
)
set Group[
:: procss groups
for /f "tokens=2 delims==" %%A in ('Set Group[ 2^>Nul') Do (
  MD "%WORKDIR%\%%A" 1>Nul 2>&1
  for %%B in ("%WORKDIR%\*%%A.txt") Do Call :MoveRenFile "%%A" "%%B"
  Rem zip files and delete group folder
  PushD "%WORKDIR%\%%A"
  7z a "..\%%A.zip" *
  PopD
  RD /S /Q "%WORKDIR%\%%A" 
)

Goto :Eof
:MoveRenFile
Set "File=%~nx2"
set "NewName=%WORKDIR%\%~1\!File:_%~1=!"
Echo Move "%~2" "%NewName%"
     Move "%~2" "%NewName%" >NUL
Goto :Eof

Промежуточный результат с файлами, переименованными и сохраненными в групповых папках:

> tree %Workdir% /F
└───Project
    └───Archive
        ├───GGTL_7642
        │       abcd.txt
        │       hsbhsd.txt
        │
        ├───HTQB_1412
        │       123456.txt
        │       1a2b3.txt
        │
        ├───HTQB_7642
        │       yt7777.txt
        │
        └───JTYU_7177
                pikachu.txt

Конечный результат с zip-файлами:

> tree /F D:\
D:\
└───Project
    └───Archive
            GGTL_7642.zip
            HTQB_1412.zip
            HTQB_7642.zip
            JTYU_7177.zip
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...