【问题标题】:Move files from folder to new folder based on # of files根据文件数将文件从文件夹移动到新文件夹
【发布时间】:2013-03-18 15:19:01
【问题描述】:

这可能是一个特定的案例,但如果有正确的代码,我相信很多人都可以从中受益。

我在一个文件夹中有数千个文件,需要拆分为多个文件夹。每个文件夹需要比之前的文件多 1 个文件,并且需要这样命名。每个文件夹至少需要有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 程序中如何做到这一点?

【问题讨论】:

  • 我知道这不会导致您的.bat 规定的限制,但Perl 是一个很好的工具来做这些事情,如果你发现自己更多地处于需要做的这个位置他们更多

标签: batch-file automation directory


【解决方案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

【讨论】:

  • 由于文件夹中的文件数需要作为文件夹名称的一部分(即.之后),最后一个文件夹中的文件数可能与后面的值不匹配. 在文件夹名称中。
  • @JamesL。 - 好的,它重命名最终目录以反映它现在包含的文件数。
  • @rojo 太棒了!我有一个警告;假设我需要将它们复制到不同的目录而不是重写同一个目录?
  • @rojo 是的。我假设将 move 重命名为 copy 但是我不熟悉你写这个的方式。 ;)
  • 不是真的,不是没有切换到另一种语言。 Windows 批处理 for 循环非常慢。 vbscript 或 jscript 可能会更快。当然,大部分时间可能都花在了实际的复制上——所以在这方面,用不同的语言重写可能不会像你希望的那样带来显着的改进。
【解决方案2】:

你在正确的轨道上。为了演示,首先我们需要创建一些文件来使用:

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!

【讨论】:

  • 感谢您的帮助!使用您的第一个代码块,这应该是创建文件吗?它创建目录而不是文件本身。也许我做错了什么?
  • 第一个代码块只是创建 30 个文件,因此我可以创建一个测试用例来演示批处理文件(第二个代码块)是否有效。您只需要第二个代码块。将min 更改为1000 并将(*.txt) 更改为(*.xml)
  • 如果您想移动文件而不是复制它们,只需将第二个代码块中的copy命令更改为move .
  • 我过去似乎遇到过for var in (mask) 以非字母顺序处理项目的情况。我觉得解析dir /o 来断言我想要的顺序更安全。
  • 要创建一些测试文件,您可以使用for /l %i in (1,1,20000) do @echo %i> %i.txt:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多