CMD/BAT - [решено] Батник сбора файлов из поддиректорий в общую папку
-
rBBWYwg
CMD/BAT - [решено] Батник сбора файлов из поддиректорий в общую папку
Уважаемые, прошу помощи по такому вопросу:
Имеем многоуровневую развитую структуру директорий "Главная-подчиненные". Например,
GENERALFOLDER
|_FOLDER-1
|_FOLDER-11
|_FOLDER-111
|_FOLDER-1111
|_FOLDER-1112
...
|_FOLDER-112
...
|_FOLDER-2
...
и т.д.
Количество подчиненных директорий не фиксировано.
Есть ли способ написать батник, который бы перемещал все файлы поддиректорий в их корневую папку? То есть, все файлы из любых поддиректорий папки FOLDER-1 перемещались бы в FOLDER-1, все файлы поддиректорий из FOLDER-2 перемещались бы в FOLDER-2, так же с FOLDER-3 и т.д.
При этом, необходимо избежать переписывания файлов при совпадений их имен, а оригинальными именами файлов можно жертвовать, но не расширениями.
Имеем многоуровневую развитую структуру директорий "Главная-подчиненные". Например,
GENERALFOLDER
|_FOLDER-1
|_FOLDER-11
|_FOLDER-111
|_FOLDER-1111
|_FOLDER-1112
...
|_FOLDER-112
...
|_FOLDER-2
...
и т.д.
Количество подчиненных директорий не фиксировано.
Есть ли способ написать батник, который бы перемещал все файлы поддиректорий в их корневую папку? То есть, все файлы из любых поддиректорий папки FOLDER-1 перемещались бы в FOLDER-1, все файлы поддиректорий из FOLDER-2 перемещались бы в FOLDER-2, так же с FOLDER-3 и т.д.
При этом, необходимо избежать переписывания файлов при совпадений их имен, а оригинальными именами файлов можно жертвовать, но не расширениями.
-
amel27
Re: CMD/BAT - [решено] Батник сбора файлов из поддиректорий в общую папку
можно, но из схемы не видна вложенность подкаталогов, к примеру, является ли FOLDER-11 подкаталогом FOLDER-1 ?.. Наконец, недостаточно полно описан алгоритм разрешения конфликтов имен, что значит "именами файлов можно жертвовать, но не расширениями"? переименовывать при совпадении?.. но тогда по какому правилу?.. или затирать?.. но тогда какой из двух файлов?
пример для одного исходного каталога, оставляющий конфликтующие файлы без изменений:
Код:
еще один пример:
пример для одного исходного каталога, оставляющий конфликтующие файлы без изменений:
Код:
Код: Выделить всё
@Echo Off
Set $SRC=C:\GENERALFOLDER\FOLDER-1\*.*
Set $DST=C:\GENERALFOLDER\FOLDER-1\
If Not Exist %$DST% MD %$DST% 2>Nul
If Not Exist %$DST% (
@Echo Ошибка! Целевой каталог не обнаружен.
Exit
)
For /F "Delims=" %%i In ('DIR /B/S/A:-D "%$SRC%"') Do (
If Not Exist "%$DST%%%~nxi" Move "%%i" "%$DST%"
)еще один пример:
http://forum.oszone.net/showthread.p...297#post922297
-
Foreigner
Re: CMD/BAT - [решено] Батник сбора файлов из поддиректорий в общую папку
Arsenik77,
Код:
Код:
Код: Выделить всё
@echo off
setlocal
set "exclude=.txt .jpg .mp3"
for /d %%i in ("generalfolder\*") do (
pushd "%%i"
for /d %%j in (*) do (
for /f "tokens=*" %%k in (' "2>nul dir /b /s /a-d "%%j"" ') do call:move "%%k"
)
popd
)
goto:eof
:move
for %%i in (%exclude%) do if /i "%%i"=="%~x1" goto:eof
set "file=%~nx1"
:check
set /a cnt+=1
if exist "%file%" set "file=%~n1(%cnt%)%~x1" && goto:check
move %1 "%file%"
set "cnt="
set "file="-
rBBWYwg
Re: CMD/BAT - [решено] Батник сбора файлов из поддиректорий в общую папку
Цитата rBBWYwg:
имелось ввиду
тогда примерно так:
Код:
имелось ввиду
CMD/BAT - [решено] Батник сбора файлов из поддиректорий в общую папку
тогда примерно так:
Код:
Код: Выделить всё
@Echo Off
Set MASK=*.*
Set ROOT=C:\GENERALFOLDER
For /F "Delims=" %%a In ('2^>nul DIR /B/S/A:D %ROOT%\*') Do (
For /F "Delims=" %%i In ('2^>nul DIR /B/S/A:-D "%%a\%MASK%"') Do (
Call :FileGetNewName "%%i" "%ROOT%"
Call :FileMove "%%i"
)
)
Exit
:FileMove
:: ---
:: %1 - полное имя исходного файла, включая путь
:: ---
Echo From: %~1
Echo To : %$N%%$I%%$X%
Echo.
Move "%~1" "%FileGetNewName%" >Nul
GoTo :EOF
:FileGetNewName
:: ---
:: %1 - полное имя исходного файла, включая путь
:: %2 - путь к целевому каталогу
:: ---
Set $I=
Set FileGetNewName=
If Not Exist "%~1" GoTo :EOF
For %%i In ("%~1") Do Set $N=%%~ni
For %%i In ("%~1") Do Set $X=%%~xi
:FileGetNewName_LOOP
Set FileGetNewName=%~2\%$N%%$I%%$X%
If Not Exist "%FileGetNewName%" GoTo :EOF
Set /A $I +=1
GoTo FileGetNewName_LOOP-
amel27
Re: CMD/BAT - [решено] Батник сбора файлов из поддиректорий в общую папку
amel27,
большое спасибо за помощь. Но оказалось, что CMD крайне долго обрабатывает мой объем файлов (порядка 10 тысяч), при этом делая много ошибок - пропускает некоторые папки, не добираясь до файлов. Вероятно, существуют какие-то количественные ограничения. К тому же, некоторые файлы просто не воспринимаются самой консолью из-за неудобоваримых имен. Поэтому я нашла способ формировать батник ПРЯМОГО поименного копирования с указанием пути от каждого файла в корневую папку. В работе сэкономила массу времени и избежала ошибок.
НО!!!
Не избежала потери информации, когда имена файлов из разных папок совпадают. Они просто замещают уже имеющийся.
Прошу помочь снова. Можно ли каким-то образом, используя прямые пути копирования файлов из субдиректорий в директории вида
copy /y /n "C:\FOLDER\SUBFOLDER\*.*" "C:\FOLDER\"
сформировать дополнительное условие дополнения имен счетчиком, если в целевой директории лежит файл с тем же именем?
большое спасибо за помощь. Но оказалось, что CMD крайне долго обрабатывает мой объем файлов (порядка 10 тысяч), при этом делая много ошибок - пропускает некоторые папки, не добираясь до файлов. Вероятно, существуют какие-то количественные ограничения. К тому же, некоторые файлы просто не воспринимаются самой консолью из-за неудобоваримых имен. Поэтому я нашла способ формировать батник ПРЯМОГО поименного копирования с указанием пути от каждого файла в корневую папку. В работе сэкономила массу времени и избежала ошибок.
НО!!!
Не избежала потери информации, когда имена файлов из разных папок совпадают. Они просто замещают уже имеющийся.
Прошу помочь снова. Можно ли каким-то образом, используя прямые пути копирования файлов из субдиректорий в директории вида
copy /y /n "C:\FOLDER\SUBFOLDER\*.*" "C:\FOLDER\"
сформировать дополнительное условие дополнения имен счетчиком, если в целевой директории лежит файл с тем же именем?
-
rBBWYwg
Re: CMD/BAT - [решено] Батник сбора файлов из поддиректорий в общую папку
Цитата rBBWYwg:
CMD крайне долго обрабатывает мой объем файлов
команды Echo из скрипта пробовали убирать?
Цитата rBBWYwg:
пропускает некоторые папки, не добираясь до файлов. Вероятно, существуют какие-то количественные ограничения
надо конкретно смотреть, мне известно только ограничение на длину имени файла+путь до 255 символов
Цитата rBBWYwg:
copy /y /n "C:\FOLDER\SUBFOLDER\*.*" "C:\FOLDER\"
но это не "батник ПРЯМОГО поименного копирования с указанием пути от каждого файла", а копирование содержимого каталога по маске
Цитата rBBWYwg:
дополнительное условие дополнения имен счетчиком, если в целевой директории лежит файл с тем же именем
средствами COPY никак, могу только привести кусок из приведенного выше скрипта:
Код:
CMD крайне долго обрабатывает мой объем файлов
CMD/BAT - [решено] Батник сбора файлов из поддиректорий в общую папку
команды Echo из скрипта пробовали убирать?
Цитата rBBWYwg:
пропускает некоторые папки, не добираясь до файлов. Вероятно, существуют какие-то количественные ограничения
CMD/BAT - [решено] Батник сбора файлов из поддиректорий в общую папку
надо конкретно смотреть, мне известно только ограничение на длину имени файла+путь до 255 символов
Цитата rBBWYwg:
copy /y /n "C:\FOLDER\SUBFOLDER\*.*" "C:\FOLDER\"
CMD/BAT - [решено] Батник сбора файлов из поддиректорий в общую папку
но это не "батник ПРЯМОГО поименного копирования с указанием пути от каждого файла", а копирование содержимого каталога по маске
Цитата rBBWYwg:
дополнительное условие дополнения имен счетчиком, если в целевой директории лежит файл с тем же именем
CMD/BAT - [решено] Батник сбора файлов из поддиректорий в общую папку
средствами COPY никак, могу только привести кусок из приведенного выше скрипта:
Код:
Код: Выделить всё
For %%i In ("C:\FOLDER\SUBFOLDER\*.*") Do (
Call :FileGetNewName "%%i" "C:\FOLDER"
Call :FileCopy "%%i" )
Exit
:FileCopy
Copy "%~1" "%FileGetNewName%" >Nul
GoTo :EOF
:FileGetNewName
Set $I=
Set FileGetNewName=
If Not Exist "%~1" GoTo :EOF
For %%i In ("%~1") Do Set $N=%%~ni&$X=%%~xi
:FileGetNewName_LOOP
Set FileGetNewName=%~2\%$N%%$I%%$X%
If Not Exist "%FileGetNewName%" GoTo :EOF
Set /A $I +=1
GoTo FileGetNewName_LOOP-
amel27
Re: CMD/BAT - [решено] Батник сбора файлов из поддиректорий в общую папку
amel27,
Поняла, спасибо.
На счет ограничений и тормозящего эффекта Echo для меня информация совершенно новая. Проверила через Excel - действительно, некоторые пути+файлы больше 255 знаков. Эффект от Echo не замеряла.
Посмотрите, пожалуйста, личку - отправлю вопрос, на который прошу ответить так же в личку.
Поняла, спасибо.
На счет ограничений и тормозящего эффекта Echo для меня информация совершенно новая. Проверила через Excel - действительно, некоторые пути+файлы больше 255 знаков. Эффект от Echo не замеряла.
Посмотрите, пожалуйста, личку - отправлю вопрос, на который прошу ответить так же в личку.
-
rBBWYwg
Re: CMD/BAT - [решено] Батник сбора файлов из поддиректорий в общую папку
Можете подправить этот батник так,
Цитата amel27:
код:
чтоб он перемещал файлы из под под...директорий в их первую директорию, например: есть такая структура
GENERALFOLDER
|_FOLDER-1
|_FOLDER-11
|_FOLDER-111
|_FOLDER-1111
|_FOLDER-1112
чтоб все файлы из поддиректорий |_FOLDER-1112 |_FOLDER-1111 |_FOLDER-111 |_FOLDER-11 переместились в |_FOLDER-1
при этом если в |_FOLDER-1 нет поддиректорий, то ее не надо трогать т.е. перемещать файлы из нее в GENERALFOLDER.
Цитата amel27:
код:
CMD/BAT - [решено] Батник сбора файлов из поддиректорий в общую папку
чтоб он перемещал файлы из под под...директорий в их первую директорию, например: есть такая структура
GENERALFOLDER
|_FOLDER-1
|_FOLDER-11
|_FOLDER-111
|_FOLDER-1111
|_FOLDER-1112
чтоб все файлы из поддиректорий |_FOLDER-1112 |_FOLDER-1111 |_FOLDER-111 |_FOLDER-11 переместились в |_FOLDER-1
при этом если в |_FOLDER-1 нет поддиректорий, то ее не надо трогать т.е. перемещать файлы из нее в GENERALFOLDER.
-
Arsenik77
Re: CMD/BAT - [решено] Батник сбора файлов из поддиректорий в общую папку
Arsenik77, Как-то так
Код:
Код:
Код: Выделить всё
@echo off
setlocal
for /d %%i in ("generalfolder\*") do (
pushd "%%i"
for /d %%j in (*) do (
for /f "tokens=*" %%k in (' "2>nul dir /b /s /a-d "%%j"" ') do call:move "%%k"
)
popd
)
goto:eof
:move
set "file=%~nx1"
:check
set /a cnt+=1
if exist "%file%" set "file=%~n1(%cnt%)%~x1" && goto:check
move %1 "%file%"
set "cnt="
set "file="-
Foreigner
Re: CMD/BAT - [решено] Батник сбора файлов из поддиректорий в общую папку
Цитата Foreigner:
Как-то так
Помоги прикрутить к твоему батнику вот этот батник (удаление файлов по маске).
Нужно чтобы в директориях оставались только определенные файлы.
Код:
Как-то так
CMD/BAT - [решено] Батник сбора файлов из поддиректорий в общую папку
Помоги прикрутить к твоему батнику вот этот батник (удаление файлов по маске).
Нужно чтобы в директориях оставались только определенные файлы.
Код:
Код: Выделить всё
chcp 1251
for %%i in (jpg mp3) do set $.%%i=_
for %%i in ("c:\temp and music\"*) do if not defined $%%~xi (
del /s/f/q "%%i"
echo.%%i >>lod_del_files.txt
)