CMD/BAT - [решено] Батник сбора файлов из поддиректорий в общую папку

Аватара пользователя
rBBWYwg

CMD/BAT - [решено] Батник сбора файлов из поддиректорий в общую папку

Сообщение rBBWYwg »

Уважаемые, прошу помощи по такому вопросу:



Имеем многоуровневую развитую структуру директорий "Главная-подчиненные". Например,



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 - [решено] Батник сбора файлов из поддиректорий в общую папку

Сообщение amel27 »

можно, но из схемы не видна вложенность подкаталогов, к примеру, является ли 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 - [решено] Батник сбора файлов из поддиректорий в общую папку

Сообщение Foreigner »

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 »

Цитата 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 »

amel27,

большое спасибо за помощь. Но оказалось, что CMD крайне долго обрабатывает мой объем файлов (порядка 10 тысяч), при этом делая много ошибок - пропускает некоторые папки, не добираясь до файлов. Вероятно, существуют какие-то количественные ограничения. К тому же, некоторые файлы просто не воспринимаются самой консолью из-за неудобоваримых имен. Поэтому я нашла способ формировать батник ПРЯМОГО поименного копирования с указанием пути от каждого файла в корневую папку. В работе сэкономила массу времени и избежала ошибок.

НО!!!

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



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

copy /y /n "C:\FOLDER\SUBFOLDER\*.*" "C:\FOLDER\"

сформировать дополнительное условие дополнения имен счетчиком, если в целевой директории лежит файл с тем же именем?
Аватара пользователя
rBBWYwg

Re: CMD/BAT - [решено] Батник сбора файлов из поддиректорий в общую папку

Сообщение rBBWYwg »

Цитата rBBWYwg:



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 »

amel27,

Поняла, спасибо.

На счет ограничений и тормозящего эффекта Echo для меня информация совершенно новая. Проверила через Excel - действительно, некоторые пути+файлы больше 255 знаков. Эффект от Echo не замеряла.

Посмотрите, пожалуйста, личку - отправлю вопрос, на который прошу ответить так же в личку.
Аватара пользователя
rBBWYwg

Re: CMD/BAT - [решено] Батник сбора файлов из поддиректорий в общую папку

Сообщение rBBWYwg »

Можете подправить этот батник так,
Цитата 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 »

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 »

Цитата 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
)
Ответить

Вернуться в «Скриптовые языки администрирования Windows»