2014-12-05 7 views
0

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

У нас есть куча файлов в следующем формате:

ICN-A10-C-1-H-8X662-00001-A-05-U 
ICN-A10-C-1-H-8X662-00002-A-01-U 
ICN-A10-C-1-H-8X662-00003-A-00-U 
ICN-A10-C-1-H-8X662-00004-A-92-U 

и нам нужно удалить последний набор цифр и следующий дефис, чтобы они читали, как:

ICN-A10-C-1-H-8X662-00001-A-U 
ICN-A10-C-1-H-8X662-00002-A-U 
ICN-A10-C-1-H-8X662-00003-A-U 
ICN-A10-C-1-H-8X662-00004-A-U 

Опять же, * .bat-файл выглядит как наше единственное решение.

Любая помощь очень ценится.

ответ

1

Вы можете использовать этот несколько странный трюк:

@echo off 
setlocal enabledelayedexpansion 

cd files 
for %%a in (*) do (
    set "name=%%a" 
    for %%b in ("!name:-=.!") do for %%c in ("%%~Nb") do (
     set "newName=%%~Nc%%~Xb" 
     ECHO ren %%a !newName:.=-! 
    ) 
) 

То есть, изменить - по . и использовать два вложенную для команды, чтобы устранить последние два расширения. Затем соберите оставшееся имя с оригинальным расширением и восстановите точку на hypens:

C:\> dir /B files 
ICN-A10-C-1-H-8X662-00003-A-00-U 
ICN-A10-C-1-H-8X662-00002-A-01-U 
ICN-A10-C-1-H-8X662-00001-A-05-U 
ICN-A10-C-1-H-8X662-00004-A-92-U 

C:\> test 
ren ICN-A10-C-1-H-8X662-00003-A-00-U ICN-A10-C-1-H-8X662-00003-A-U 
ren ICN-A10-C-1-H-8X662-00002-A-01-U ICN-A10-C-1-H-8X662-00002-A-U 
ren ICN-A10-C-1-H-8X662-00001-A-05-U ICN-A10-C-1-H-8X662-00001-A-U 
ren ICN-A10-C-1-H-8X662-00004-A-92-U ICN-A10-C-1-H-8X662-00004-A-U 
+0

+2 для скрытности и двойных вложенных циклов FOR в DOS :-) – mnemotronic

0

Вы можете использовать команду rename в каталоге, где находятся файлы, которые вы хотите переименовать.

rename 's/\d+-(?=\D*$)//' * 

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

Regex Demo

+0

'rename' прекрасен в Linux, но это не входит в ОС Windows без Cygwin или gnuwin32. Тег 'batch-file' предназначен для пакетного сценария Windows. Однако я не могу ошибаться в ваших предложениях. Я очень часто использую ssh для своей linux-бокса, поэтому я могу перейти обратно в свою файловую систему Windows поверх autofs и использовать утилиту Linux 'rename'. Мне не повезло с версией cygwin. – rojo

+0

Да, если бы мы использовали Linux. Но нет. :(Regex is easy. – zedkineece

1

К сожалению, операции нет регулярных выражений

for /f "tokens=1-11 delims=-" %%a in (' 
    dir /b /a-d * 
') do if "%%k"=="" if not "%%j"=="" (
    echo ren "%%a-%%b-%%c-%%d-%%e-%%f-%%g-%%h-%%i-%%j" "%%a-%%b-%%c-%%d-%%e-%%f-%%g-%%h-%%j" 
) 

переименование только вторит утешать. Если выход правильный, удалите команду echo.

Смежные вопросы