IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Программирование (http://www.imho.ws/forumdisplay.php?f=40)
-   -   Файл .BAT для стековой перенумерации файлов - нужен совет (http://www.imho.ws/showthread.php?t=148169)

MeatEater 18.03.2015 23:07

Файл .BAT для стековой перенумерации файлов - нужен совет
 
Проблема такая. Есть директория, в которой находятся файлы с различными расширениями, а имена этих файлов имеют одинаковую структуру: они начинаются с цифры от 1 до 9, за ней идет подчеркивание, далее неважно что, и расширение, то есть такие файлы, например:

3_abcd.txt
4_sadghj_70.zip
9_ddddddddddddd.jpg

Файлов в директории может быть от 2 до 9.

BAT файл должен знать переменную, которая определяет глубину стека - ее можно установить тоже от 2 до 9. Пусть это будет
set STACKDEPTH=7
- глубина стека равна 7. В таком случае, BAT прежде всего должен удалить из директории все файлы, первый знак в имени которых >=STACKDEPTH, если такие файлы есть (это файлы 7_*.*, 8*.* и 9*.*).

Это будет DEL по маске в цикле, например, и хорошо бы проверять что-то вроде if exist.

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

6_*.* должен стать 7_*.*
и т. д., до
1*.* должен стать 2_*.*

Для этого дела как бы напрашивается цикл с токенами типа такого:
for /f "tokens=*" %%i ... do ( rename "%...%\%%i" )

Ограничение: НЕЛЬЗЯ удалять или переименовывать файлы, которые начинаются не с цифры и подчеркивания. То есть файл типа Read.me должен сохраниться.

Вроде как оно теоретически понятно, но в целом не складывается. Если кому-то не очень трудно, был бы весьма признателен за кусок кода. Думаю, что не я один нашел бы применение такому стеку. Можно в плане развития идеи сделать стек и от 01 до 99, обязательно с лидирующим нулем, но вряд ли это нужно рядовому юзеру, а нерядовой имеет другие инструменты.

Спасибо.

P. S. Собственно, это мне нужно как замена стека nnBackup, в связи с переходом на архивацию от zip на 7z, из-за ограничений по размеру архива у zip в моей конкретной ситуации. Да, nnBackup может работать с внешним архиватором, но не всегда хочет. Не принципиально для BAT, но работать ему предстоит на Win7 32 или 64. Спасибо.

Borland 19.03.2015 01:37

Вкратце примерно так:
rename_it.cmd
Код:

set /a STACKDEPTH=7
set /a BIGDIGIT=%STACKDEPTH%-1
set "WORKDIR=x:\any dir"

pushd "%WORKDIR%"
for /l %%A in (%STACKDEPTH%,1,9) do del /q "%%A_*.*"
for /l %%B in (%BIGDIGIT%,-1,1) do (
        for /f %%C in ('dir /b "%%B_*.*"') do call :RENAMEFILE "%%C"
)
popd
goto :EOF

:RENAMEFILE
set "OLDNAME=%~1"
SET /a NEWDIGIT=%OLDNAME:~0,1%+1
ren "%OLDNAME%" "%NEWDIGIT%_%OLDNAME:~2%"
goto :EOF

:gigi:
P.S. Код НЕ оттестирован!
Не тестируйте его на рабочей директории...
С ведущим нулём морочиться просто лень...

MeatEater 19.03.2015 02:38

Borland, спасибо.

Ведущий ноль - это излишество, Вы правы.

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

Borland 19.03.2015 09:47

Цитата:

Сообщение от MeatEater (Сообщение 1781106)
Переименование пока не идет... В переменные попадает мусор

Возможно, надо добавить в процедуру переименования setlocal ENABLEDELAYEDEXPANSION и соответственно заменить "%" на "!" при разыменовании переменных OLDNAME и NEWDIGIT. Проблема, скорее всего, именно в этом...
Можно попробовать вообще включить ENABLEDELAYEDEXPANSION в начале файла и использовать "!" вместо "%". Нету времени на эксперименты... :(
И ещё тщательно проверьте скрипт на отсутствие лишних пробелов в конце строк. Это общая рекомендация с руборда для кода, скопипащенного с Web.

MeatEater 19.03.2015 12:26

Borland, спасибо еще раз. Похоже, дело не все-таки не в "%" и "!". Если бы мусор в пременных был в виде фрагментов имен файлов - то да, а сейчас переменные принимают такие значения, например:

set "OLDNAME=Том"
set "OLDNAME=Серийный"
set "OLDNAME=Содержимое"
set "OLDNAME=18.03.2015"

- это явно из описания тома или папки, но не имена файлов, а как бы на уровень выше.

Путь задаю явно в полном виде:
set "WORKDIR=d:\Test\Stack\"
И без последнего слэша то же самое. В именах файлов русских букв не бывает, да и спецсимволов тоже, и пробелов. Но все уже близко к успеху.

P. S. Не могу поставить плюс в репутацию - сначала нужно поставить кому-то другому...

Borland 19.03.2015 12:32

Проверил-таки код.
Не работал он из-за пары ошибок: пропущенной опции "/b" в команде dir и пропущенного "%" в команде переименования. :gigi:
Исправил, теперь должно работать как надо.
Тем не менее - прежде, чем использовать в работе - как следует проверьте, что он делает именно то, что требуется. ;)


P.S. Для имён файлов и папок с пробелами тоже должно работать.
Язык имён файлов может быть хоть китайский: в командах батника и масках файлов в данном случае используется исключительно латиница, цифры и знак подчёркивания, которые во всех кодовых страницах имеют одни и те же коды.

MeatEater 19.03.2015 16:53

Borland, это прекрасно работает, спасибо за Ваше время.

Думаю, этот скрипт будет очень полезен еще много кому, просто эпическая сила. И да, имена с пробелами обрабатывает без проблем. Такой скрипт можно в учебнике по cmd публиковать.
Комментарий Модератора:
Borland:
Оффтоп вынесен в отдельный топик "Немного про архивацию и резервное копирование. Скрипты и архиваторы."


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

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