2013-03-18 223 views
2

這可能是一個特定情況,但考慮到正確的代碼,我相信很多人都可以從中獲得。根據文件數量將文件從文件夾移動到新文件夾

我在一個文件夾中有數千個文件需要分成多個文件夾。每個文件夾需要比之前的文件多一個文件,並且需要按照這種方式命名。每個文件夾至少需要至少有X個文件。例如,下面是最終的結果可能是什麼樣子,如果每個文件夾必須有至少1文件:

U:\Batch\Original\ --> 
    file1.xml 
    file2.xml 
    file3.xml 
    file4.xml 
    file5.xml 
    file6.xml 

U:\Batch\Processed\ --> 
    folder1.1 --> 
     file1.xml 
    folder2.2 --> 
     file2.xml 
     file3.xml 
    folder3.3 --> 
     file4.xml 
     file5.xml 
     file6.xml 

我已經開始attempting this on my own,但我覺得我的路要走。假設我在每個文件夾中至少需要1000個文件。如何在.bat程序中執行此操作?

+1

我知道這不會導致一個答案給你'.bat'規定的限制,但'Perl'是一個偉大的工具做這類事情,你應該發現自己更在這需要做更多的位置 – amphibient 2013-03-18 16:07:47

回答

1

你在這裏。這應該處理它。

@echo off 
setlocal enabledelayedexpansion 
set /a "minimum=1000, outer=minimum, inner=1" 
set folder_prefix=folder 
call :mkfolder 

:: dir list, order by name, exclude directories, exclude this batch script 
for /f "delims=" %%I in ('dir /b /o:n /a:-d ^| findstr /v "%~nx0"') do (
    if !inner! GTR !outer! (
     set /a "inner=1, outer+=1" 
     call :mkfolder 
    ) 
    copy "%%I" "!folder!" >NUL 
    set /a "inner+=1" 
) 

:: rename final directory to reflect the number of files contained within 
for /f "delims=" %%I in ("%folder%") do set "to=%%~dpnI" 
set /a "inner-=1" 
ren "%folder%" "%to%.%inner%" 


goto :EOF 

:mkfolder 
set folder=%folder_prefix%!outer!.!outer! 
if not exist "!folder!" mkdir "!folder!" 
goto :EOF 
+0

由於文件夾中的文件數量需要是文件夾名稱的一部分(即'.'後面),文件數量在最後一個文件夾中可能與文件夾名稱中的「。」後面的值不匹配。 – 2013-03-18 16:04:52

+0

@JamesL。 - 好吧,它會重命名最終目錄以反映它現在包含的文件數量。 – rojo 2013-03-18 16:23:31

+0

@rojo太棒了!我有一個警告;假設我需要**將它們**複製到不同的目錄中,而不是**重寫**相同的目錄? – Shaz 2013-03-18 16:29:52

1

你是在正確的軌道上。爲了演示,首先我們需要創建一些文件一起工作:

md c:\y 
cd /d c:\y 
for %i in (1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30) do echo.>%i.txt 

現在我們可以從c:\y運行批處理文件來創建子文件夾和複製文件,如你表示(但3爲最低在這個例子中的文件):

@echo off 

setlocal EnableDelayedExpansion 

set cnt=1 
set fldr=1 
set min=3 

for %%i in (*.txt) do (
    if !cnt! GTR !min! (
    set /a cnt-=1 
    ren folder!fldr! folder!fldr!.!cnt! 
    set cnt=1 
    set /a fldr+=1 
    set /a min+=1 
) 

    md folder!fldr! > nul 2>&1 

    copy "%%i" folder!fldr! 

    set /a cnt+=1 
) 

set /a cnt-=1 
ren folder!fldr! folder!fldr!.!cnt! 
+0

我感謝幫助!用你的第一個代碼塊,這應該是創建文件?它創建目錄,但不創建文件本身。也許我做錯了什麼? – Shaz 2013-03-18 16:14:06

+0

第一個代碼塊只是創建30個文件,所以我可以創建一個測試用例來演示批處理文件(第二代碼塊)的工作原理。你只需要第二個代碼塊。將'min'改爲'1000'和'(* .txt)'爲'(* .xml)'。 – 2013-03-18 16:34:28

+0

如果您想**移動**文件而不是**複製**,只需在第二個代碼塊中將'copy'命令更改爲'move'即可。 – 2013-03-18 16:47:20

相關問題