пакетный скрипт для перемещения x файлов в пустые папки

пакетный скрипт для перемещения x файлов в пустые папки

Я новичок в пакетных скриптах и ​​ищу скрипт, который может делать следующее:

У меня очень большое количество файлов, более 150000.
Эти 150000 файлов находятся в dir/dir_main.
Я хочу запустить пакетный скрипт из командной строки Windows, чтобы он выполнял следующее:


перемещать по 100 файлов за раз, неважно, какие именно 100, в каждый подкаталог


dir/dir_main/subdir1
dir/dir_main/subdir2
dir/dir_main/subdir3
.
.
.
dir/dir_main/subdir#


обратите внимание на словодвигаться не копировать.


Я нашел следующий скрипт, который перемещает все:

@ECHO OFF

SET "source=C:\Users\msalehi\Documents\row-columnn fix\test_move\olddir"
SET "dest=C:\Users\msalehi\Documents\row-columnn fix\test_move\newdir"
SET "FileList=file1.txt file2.txt file8.txt" 

SET "dupCnt=1"

FOR /R "%source%" %%A IN (%FileList%) DO (
    IF NOT EXIST "%dest%\%%~NXA" (
        XCOPY /F /Y "%%~FA" "%dest%\" && IF EXIST "%%~FA" DEL /Q /F "%%~FA"
    ) ELSE (
        CALL :DupeRoutine "%%~FA" "%%~NA" "%%~XA"
        )
    )
GOTO :EOF

:DupeRoutine
IF EXIST "%dest%\%~2_(%dupCnt%)%~3" (
    SET /A dupCnt=%dupCnt%+1
    CALL :DupeRoutine "%~1" "%~2" "%~3"
) ELSE (
    IF NOT EXIST "%dest%\%~2_(%dupCnt%)%~3" ECHO F | XCOPY /Y /F "%~1" "%dest%\%~2_(%dupCnt%)%~3" && DEL /Q /F "%~1"
    SET "dupCnt=1" 
    )
GOTO :EOF

мне это бесполезно.

Я не собираюсь запускать это через другую оболочку, Linux и т. д.

Мне нужно запустить пакетный файл через cmd Windows.

решение1

Что-то вроде этого может сработать.

@echo off
set /a counter=1
set /a filesperfolder=100
cd dir\dir_main

:loopstart
set dirname=subdir%counter%
md %dirname%
echo %dirname%

dir /b | findstr /v /i "subdir*"> %temp%\temp.txt && for /l %%l in (1,1,%filesperfolder%) do @for /f "tokens=1,2* delims=:" %%a in ('findstr /n /r "^" %temp%\temp.txt ^| findstr /r "^%%l:"') do @move %%b %dirname%\%%b >nul

set /a counter=%counter%+1
for /f "tokens=*" %%a in ('type %temp%\temp.txt ^| find /c /v ""') do set _filesmoved=%%a
del %temp%\temp.txt
IF %_filesmoved% LSS 100 goto done

goto loopstart

:done
cls
echo All files were moved!!
pause
exit

Команда move в скрипте перемещает все элементы в dir_main, а также папки (за исключением недавно созданных папок subdir), но это может не быть проблемой. Это также займет некоторое время (powershell, вероятно, будет быстрее). Вы также должны запустить ее за один раз или вверх по переменной counter (иначе она начнется снова с создания subdir1). Это не лучший вариант, но я надеюсь, что он будет вам полезен.

Связанный контент