Показать полную графическую версию : [решено] Перемещение и переименование файлов
Доброго дня всем!
Подсобите пожалуйста BAT'ником.
Есть папка с файлами "NaklScan":
"2018-01-18_(1).tif",
"2018-01-18_(2).tif",
"2018-01-18_(3).tif",
"2018-01-18_(4).tif",
"2018-01-18_(5).tif",
"2018-01-18_(6).tif",
... ... ... ... ... ... ...
"2018-01-18_(7000).tif",
... ... ... ... ... ... ...
которая после 3000 файлов начинает долго открываться (т.к. строится список).
Нужно чтобы из этой папки (NaklScan) файлы перемещались в другую папку (NaklScan5) - предположим по 100 шт.
Но загвоздка в том, что после перемещения файлов:
"2018-01-18_(1).tif",
"2018-01-18_(2).tif",
"2018-01-18_(3).tif",
"2018-01-18_(4).tif",
"2018-01-18_(5).tif",
"2018-01-18_(6).tif",
... ... ... ... ... ... ...
"2018-01-18_(7000).tif",
... ... ... ... ... ... ...
в папку "NaklScan5", в папке "NaklScan" будут снова создаваться файлы с такими же именами.
Т.е. нужно чтобы при перемещении в папку "NaklScan5" порядковый номер продолжался:
"2018-01-18_(7001).tif",
"2018-01-18_(7002).tif",
"2018-01-18_(7003).tif",
"2018-01-18_(7004).tif",
"2018-01-18_(7005).tif",
"2018-01-18_(7006).tif".
которая после 3000 файлов начинает долго открываться »
тогда почему сразу не предусмотреть заполнение таким образом, вошли в папку if кол-во==1000 вышли и т.д. и лучше это сразу делать (надо целиком знать задачу, что когда и как формирует файлы), а не перемещать потом, а сейчас ..., bat долго будет переваривать такие количества, тут лучше PS подключить.
тогда почему сразу не предусмотреть заполнение таким образом, вошли в папку if кол-во==1000 вышли и т.д. и лучше это сразу делать (надо целиком знать задачу, что когда и как формирует файлы), а не перемещать потом, а сейчас ..., bat долго будет переваривать такие количества, тут лучше PS подключить. »Файлы сканируются в один каталог, после чего они распознаются и переносятся в другой каталог для дальнейшей обработки. Нельзя раскидать по каталогам - по 1000 файлов!
я так понимаю дело выглядит приблизительно так:
- что-то там сканируется в tif
- tif распознается
- tif переносится в другой каталог для последующей обработки (интересно для какой, хотя к делу это и не относится)
как происходит распознавание? учитывая приведенные числа - тоже скриптом, или софт какой-то хитрый который на это нацелен?
Если скрипт - дописать Перенос в другой каталог после распознавания. Если софтом - нужно разбираться к чему привязываться (например как определить что файл уже распознан и готов к переносу?)
чтобы нумерация была сквозная можно либо искать максимальное по номеру имя в "NaklScan5" и прибавлять к нему 1 (или 2,3,5,7000 - как задумано, в общем), либо еще проще - записывать номер последнего перенесенного файла в, например, текстовик, и при переносе очередного файла - читать и прибавлять опять же столько сколько нужно.
Где я не прав? В каком месте нужна помощь?
Вопрос касается сканирования (не распознавания).
Распознавания не берем в счёт.
Т.е. есть программа PaperPort, которая сканирует в один каталог по 3000-7000 изображений в формате *.tiff. Имя: гггг-мм-дд_(#)
Когда порог сканирования достигает отметки в 2000, то следующие сканируемые файлы *.tiff начинаются отображаться в программе медленнее (может программа такая, может компьютер слаб - не столь важно) -> влияет на это именно количество файлов в каталоге.
Вот и пришла идея, а что если состряпать BAT-ник, который будет таскать *.tif файлы в другой каталог (в который пользователь не заходит - соответственно список не формируется - соответственно компьютер не тормозит и т.п. и т.д.), но таким образом, чтобы все файлы имели порядковый номер: гггг-мм-дд_(порядковый_номер).
Вариант:
1. BAT-ник таскает файлы все в одну папку - но не перезаписывает их, а переименовывает, например:
гггг-мм-дд_(порядковый_номер)1;
гггг-мм-дд_(порядковый_номер)2;
гггг-мм-дд_(порядковый_номер)3
...
2. Оставляя:
гггг-мм-дд_
переименовывает порядковый номер в скобках.
Итог:
гггг-мм-дд_(1);
гггг-мм-дд_(2);
гггг-мм-дд_(3);
гггг-мм-дд_(4);
гггг-мм-дд_(5);
гггг-мм-дд_(6);
...
...
...
т.е. нужно просто брать файлы начиная с самого старого в одном каталоге и переместить фиксированное количество файлов (например 1000) в другой каталог. с нумерацией не совсем понятно: например в папке последний файл который был перенесен носит имя "гггг-мм-дд_(1000).tiff" следующие файлы должны продолжить нумерацию ("гггг-мм-дд_(1001).tiff","гггг-мм-дд_(1002).tiff" и т.д.) или как-то по другому?
т.е. нужно просто брать файлы начиная с самого старого в одном каталоге и переместить фиксированное количество файлов (например 1000) в другой каталог. с нумерацией не совсем понятно: например в папке последний файл который был перенесен носит имя "гггг-мм-дд_(1000).tiff" следующие файлы должны продолжить нумерацию ("гггг-мм-дд_(1001).tiff","гггг-мм-дд_(1002).tiff" и т.д.) или как-то по другому? »Всё верно!
Примерно так. numb.txt - файл с номером последнего перенесенного файла
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
set ocat=C:\старая\папка\
set ncat=Н:\овая\папка\
for /f %%j in (numb.txt) do set numb=%%j
set /a N=0
for /F "delims=" %%i in ('dir /a:-d /o:d /t:c /b') do (
set /a N=!N!+1
if !N! leq 1000 (
set /a numb=!numb!+1
set oname=%%i
set nname=!oname:~0,12!!numb!!oname:~-6!
REM move /Y !ocat!!oname! !ncat!!nname!
echo !numb!>numb.txt
)
)
it3,
я вот одного не пойму - зачем переименовывать файлы, продолжать нумерацию, вы же их просто перемещаете, раскидывайте по одной тысяче, например, как есть да и все:
(имею ввиду что для "01-18" конец в нумерации надеюсь бывает и вряд-ли это 1000 000, поэтому в конце дня батничек на запуск - к утру раскидает, а утром уже "01-19" и поехали заново)
@echo off
set "d=NaklScan"
:: Число файлов для разбивки по папкам
set kf=1000
:l
set /a m+=1
setlocal enabledelayedexpansion
2>nul dir/a-d/b "%d%"|>nul find /v "" || goto :eof
for /f "delims=" %%a in ('2^>nul dir /a-d/b "%d%"') do (
if not exist "%d%%m%" md "%d%%m%"
set /a n+=1& if !n! leq %kf% >nul move/y "%d%\%%a" "%d%%m%\%%a"
)
endlocal
goto l
pause
То есть в том другом каталоге получим громадное число файлов? »
Да.
А, кстати, какой максимальный номер может быть достигнут? »
Всегда по разному.
Почему папка называется "NaklScan5" а не "NaklScan125", например: - номер в имени папки несет смысловую нагрузку? »
Нет смысла.
А если в исходном каталоге, например, 3333 файла, то там после перемещения 1000 файлов останется 2333 до следующего запуска батника? »
Нет. К 2333 будет постоянно прибавляться еще файлы.
поэтому в конце дня батничек на запуск - к утру раскидает, а утром уже "01-19" и поехали заново »
Нужно чтобы это выполнялось не утром, не в конце дня, а на протяжении дня - т.е. пока документы сканируются.
Я ведь написал.
Когда порог сканирования достигает отметки в 2000, то следующие сканируемые файлы *.tiff начинаются отображаться в программе медленнее (может программа такая, может компьютер слаб - не столь важно) -> влияет на это именно количество файлов в каталоге. »
Или же, сделать так:
1. Перемещение файлов без перезаписи (если имя уже такое существует), но не теряя новый файл (например в его имя добавить какой нибудь символ).
и
2. Переименовать всё содержимое в папке в:
"2018-01-18_(1).tif",
"2018-01-18_(2).tif",
"2018-01-18_(3).tif",
"2018-01-18_(4).tif",
"2018-01-18_(5).tif",
"2018-01-18_(6).tif",
... ... ... ... ... ... ...
"2018-01-18_(7000).tif",
... ... ... ... ... ... ...
megaloman
12-01-2018, 07:28
it3, цель батника- уменьшить число файлов в папке NaklScan. Откуда берётся исходная нумерация? Каждый день она начинается с 1? Программа сканирования сама определяет исходный номер и продолжает нумерацию сегодняшнего дня? Тогда зачем что-то переименовывать? Пусть батник оставляет в папке NaklScan, например, 1000 последних файлов (или вообще 1 последний, чтобы программа сканирования продолжила нумерацию), а всё остальное перемещает в NaklScan5, причем не в общую кучу, а по подпапкам, для каждого дня своя. Например: NaklScan5\гггг-мм-дд\
it3, цель батника- уменьшить число файлов в папке NaklScan. Откуда берётся исходная нумерация? Каждый день она начинается с 1? »
Каждый день она начинается с 1.
Пусть батник оставляет в папке NaklScan, например, 1000 последних файлов, а всё остальное перемещает в NaklScan5, причем не в общую кучу, а по подпапкам, для каждого дня своя. Например: NaklScan5\гггг-мм-дд\ »
Задача: Все файлы должны находиться в одном каталоге, без подкаталогов.
Оставляем 1 файл в папке NaklScan, чтобы программа сканирования могла продолжить нумерацию, а всеостальные перемещаем в NaklScan5. Никакого дублирования имён. »
Переместили:
"2018-01-18_(2).tif",
"2018-01-18_(3).tif",
"2018-01-18_(4).tif",
"2018-01-18_(5).tif",
Оставили:
"2018-01-18_(1).tif"
Сканируем, создаются новые имена:
"2018-01-18_(2).tif",
"2018-01-18_(3).tif",
"2018-01-18_(4).tif",
"2018-01-18_(5).tif",
При перемещении - они не должны заменяться.
megaloman
12-01-2018, 07:50
it3, Переместили:
"2018-01-18_(1).tif",
"2018-01-18_(2).tif",
"2018-01-18_(3).tif",
"2018-01-18_(4).tif",
Оставили:
"2018-01-18_(5).tif"
Сканируем, создаются новые имена:
"2018-01-18_(6).tif",
"2018-01-18_(7).tif",
"2018-01-18_(8).tif",
"2018-01-18_(9).tif",
При перемещении - они не будут заменяться, если программа сканирования продолжит нумерацию.
И вообще, в любом случае надо не перемещать в другую папку по 1000 файлов, а оставлять в исходной минимальное количество, например 1.
it3, Переместили:
"2018-01-18_(1).tif",
"2018-01-18_(2).tif",
"2018-01-18_(3).tif",
"2018-01-18_(4).tif",
Оставили:
"2018-01-18_(5).tif"
Сканируем, создаются новые имена:
"2018-01-18_(6).tif",
"2018-01-18_(7).tif",
"2018-01-18_(8).tif",
"2018-01-18_(9).tif",
При перемещении - они не будут заменяться, если программа сканирования продолжит нумерацию.
И вообще, в любом случае надо не перемещать в другую папку по 1000 файлов, а оставлять в исходной минимальное количество, например 1. »
Прошу прощения.
Протестировал.
Если мы переместили:
"2018-01-18_(1).tif",
"2018-01-18_(2).tif",
"2018-01-18_(3).tif",
"2018-01-18_(4).tif",
Оставили:
"2018-01-18_(5).tif"
Сканируем, создаются новые имена:
"2018-01-18_(1).tif",
"2018-01-18_(2).tif",
"2018-01-18_(3).tif",
"2018-01-18_(4).tif".
megaloman
12-01-2018, 10:06
Оставили:
"2018-01-18_(5).tif"
Сканируем, создаются новые имена:
"2018-01-18_(1).tif",
"2018-01-18_(2).tif",
"2018-01-18_(3).tif",
"2018-01-18_(4).tif". »Ну, раз пошла такая вакханалия, то вот решение:
@Echo Off
cls
Set "BoxIn=Z:\Box_In\NaklScan"
Set "BoxOut=Z:\Box_In\NaklScan5"
Set "Mask=20??-??-??_(*).tif"
If Not Exist "%BoxOut%" Md "%BoxOut%"
SetLocal EnableExtensions EnableDelayedExpansion
Set "TDate="
FOR /F "usebackq tokens=1,2* delims=()" %%i IN (`2^>nul Dir "%BoxIn%\%Mask%" /A:-D /B /O:D /T:C`) DO (
If Not "!TDate!"=="%%i" (
Set "TDate=%%i"
Call :LastNum "%%i" "%%k" "N"
)
Set /A N+=1
>nul Move "%BoxIn%\%%i(%%j)%%k" "%BoxOut%\%%i(!N!)%%k"
)
GoTo :Eof
:LastNum
Set /A %~3=0
FOR /F "usebackq tokens=2 delims=()" %%n IN (`2^>nul Dir "%BoxOut%\%~1(*)%~2" /A:-D /B /O:-D /T:C`) DO Set /A %~3=%%n &GoTo :Eof
GoTo :Eof
Пропишите свои пути в начале скрипта!Всё же задумался бы насчет того, чтобы файлы забрасывались не в общую кучу, а рассовывались по папкам за день. Иметь мильён файлов в одной папке не фэншуйно.
Оставили:
"2018-01-18_(5).tif"
Сканируем, создаются новые имена:
"2018-01-18_(1).tif",
"2018-01-18_(2).tif",
"2018-01-18_(3).tif",
"2018-01-18_(4).tif". »
Я всё ждал, когда сей факт внезапно :) всплывёт в процессе реализации хотелки порциями.
megaloman, огромное спасибо. BAT-ник работает как надо.
Вопрос закрыт.
DJ Mogarych
12-01-2018, 14:02
Если в сканере можно настроить именование файлов не только днём, но и прибавлять к нему время, типа 2018-01-18_12-15-23.tif - проблемы бы вообще не существовало. Можно было бы переносить в какие угодно подпапки, хоть по часам.
Если этого сделать нельзя, тогда можно файлы переименовывать по дате создания перед копированием, а затем уже рассовывать по папкам.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.