imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Компьютеры > Программирование
Опции темы
Старый 18.03.2015, 22:07     # 1
MeatEater
Member
 
Регистрация: 25.08.2002
Сообщения: 207

MeatEater Путь к славе только начался
Question Файл .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. Спасибо.
MeatEater вне форума  
Старый 19.03.2015, 00:37     # 2
Borland
СуперМод
IMHO Консультант 2005-2009
 
Аватар для Borland
 
Регистрация: 14.08.2002
Адрес: Московская ПЛ, ракетный отсек
Пол: Male
Сообщения: 13 298

Borland - Гад и сволочь
Вкратце примерно так:
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

P.S. Код НЕ оттестирован!
Не тестируйте его на рабочей директории...
С ведущим нулём морочиться просто лень...
__________________
Не засоряйте форум "спасибами"! Для выражения благодарности существуют ПС и репутация! Соблюдайте Правила!
Распространенье наше по планете
Особенно заметно вдалеке:
В общественном парижском туалете
Есть надписи на русском языке

В. Высоцкий


Последний раз редактировалось Borland; 19.03.2015 в 11:31. Причина: ашыпке :)
Borland вне форума  
Старый 19.03.2015, 01:38     # 3
MeatEater
Member
 
Регистрация: 25.08.2002
Сообщения: 207

MeatEater Путь к славе только начался
Borland, спасибо.

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

Удаление лишних файлов работает, как надо, это вообще хорошо. Переименование пока не идет, но попробую разобраться. В переменные попадает мусор, но это пройдет со временем, надеюсь. Спасибо.
MeatEater вне форума  
Старый 19.03.2015, 08:47     # 4
Borland
СуперМод
IMHO Консультант 2005-2009
 
Аватар для Borland
 
Регистрация: 14.08.2002
Адрес: Московская ПЛ, ракетный отсек
Пол: Male
Сообщения: 13 298

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

В. Высоцкий

Borland вне форума  
Старый 19.03.2015, 11:26     # 5
MeatEater
Member
 
Регистрация: 25.08.2002
Сообщения: 207

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

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

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

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

P. S. Не могу поставить плюс в репутацию - сначала нужно поставить кому-то другому...
MeatEater вне форума  
Старый 19.03.2015, 11:32     # 6
Borland
СуперМод
IMHO Консультант 2005-2009
 
Аватар для Borland
 
Регистрация: 14.08.2002
Адрес: Московская ПЛ, ракетный отсек
Пол: Male
Сообщения: 13 298

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


P.S. Для имён файлов и папок с пробелами тоже должно работать.
Язык имён файлов может быть хоть китайский: в командах батника и масках файлов в данном случае используется исключительно латиница, цифры и знак подчёркивания, которые во всех кодовых страницах имеют одни и те же коды.
__________________
Не засоряйте форум "спасибами"! Для выражения благодарности существуют ПС и репутация! Соблюдайте Правила!
Распространенье наше по планете
Особенно заметно вдалеке:
В общественном парижском туалете
Есть надписи на русском языке

В. Высоцкий

Borland вне форума  
Старый 19.03.2015, 15:53     # 7
MeatEater
Member
 
Регистрация: 25.08.2002
Сообщения: 207

MeatEater Путь к славе только начался
Borland, это прекрасно работает, спасибо за Ваше время.

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

Теги (метки)
bat, cmd

Опции темы

Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


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




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