将一个目录中的大量文件移动到多个目录

时间:2010-03-29 23:14:34

标签: batch-file

我希望创建一个Windows批处理脚本来移动大约2,000个文件并将它们拆分,以便每个文件夹有10个文件。我试图创建一个批处理脚本,但语法真的让我大吃一惊。这是我到目前为止所拥有的

@echo off

:: Config parameters
set /a groupsize = 10
:: initial counter, everytime counter is 1, we create new folder
set /a n = 1
:: folder counter
set /a nf = 1

for %%f in (*.txt) do (
:: if counter is 1, create new folder
if %n% == 1 (
    md folder%nf%
    set /a n += 1
)

:: move file into folder
mv -Y %%f folder%nf%\%%f

:: reset counter if larger than group size
if %n% == %groupsize% (
    set /a n = 1
) else (
    set /a n += 1
)
)
pause

这个脚本基本上是循环遍历目录中的每个.txt文件。它在开头创建一个新目录并将10个文件移动到该目录中,然后再次创建一个新文件夹并将另外10个文件移动到该目录中,依此类推。但是,我遇到问题,n变量没有在循环中递增?我确定还有其他错误,因为即使使用pause,CMD窗口也会关闭。感谢您的帮助或指导,感谢您的时间!

3 个答案:

答案 0 :(得分:8)

您需要了解的一些事项:

  • SETLOCAL ENABLEDELAYEDEXPANSION是必需的,因为您正在更改变量并在单个带括号的块中使用其更改的值。命令行上的SET /?将提供一些信息。在互联网上搜索这个词,你会找到更好的解释。
  • 我对变量使用!nf!格式的地方与延迟扩展有关。
  • 正如ghostdog74所说,你没有增加%nf%
  • 我将nf初始化为0而不是1.这样,您要将文件移动到的文件夹编号与刚刚创建的文件夹编号相同。在您的代码中,您创建folderX,然后递增X,然后尝试将文件移动到X + 1。
  • 您必须使用MOVE移动文件,MV无效。

此批处理文件有效......但请确保您进行测试!我只测试了少量文件。

@ECHO OFF

SETLOCAL ENABLEDELAYEDEXPANSION

:: Config parameters
SET groupsize=10
:: initial counter, everytime counter is 1, we create new folder
SET n=1
:: folder counter
SET nf=0

FOR %%f IN (*.txt) DO (
  :: if counter is 1, create new folder
  IF !n!==1 (
    SET /A nf+=1
    MD folder!nf!
  )

  :: move file into folder
  MOVE /Y "%%f" folder!nf!

  :: reset counter if larger than group size
  IF !n!==!groupsize! (
    SET n=1
  ) ELSE (
    SET /A n+=1
  )
)

ENDLOCAL

PAUSE

答案 1 :(得分:0)

您没有递增%nf%

答案 2 :(得分:0)

这是一个批处理文件(此处称为“ x.bat”),具有指向您要将文件放入其中的文件夹的链接:

mkdir "FilesToHere\1"
mkdir "FilesToHere\1\Example 1"
mkdir "FilesToHere\1\2"
mkdir "FilesToHere\1\2\Example2"
mkdir "FilesToHere\1\2\Example2\3"
mkdir "FilesToHere\1\2\Example2\4"
mkdir "FilesToHere\1\2\Example2\3\Example3"
mkdir "FilesToHere\1\2\Example2\3\Example 1"
mkdir "FilesToHere\1\2\Example2\3\Example4"
mkdir "FilesToHere\1\2\Example2\3\Example4\5"
mkdir "FilesToHere\1\2\Example2\3\Example4\5\Example5"
mkdir "FilesToHere\1\2\Example2\3\Example4\5\Example5\6"
mkdir "FilesToHere\1\2\Example2\3\Example4\5\Example5\7"
mkdir "FilesToHere\1\2\Example2\3\Example4\5\Example5\7\Example 1"
mkdir "FilesToHere\1\2\Example2\3\Example4\5\Example5\7\Example6\1"
mkdir "FilesToHere\1\2\Example2\3\Example4\5\Example5\7\Example6\1\Example7"
mkdir "FilesToHere\1\2\Example2\3\Example4\5\Example5\7\Example7"
mkdir "FilesToHere\1\2\Example2\3\Example4\5\Example 1"
mkdir "FilesToHere\1\2\Example2\3\Example8"
mkdir "FilesToHere\1\Example9"

2000个文件/ 20个文件夹= 100个文件/文件夹。 (您可以根据自己的文件/文件夹首选项更改以下数字。“ [...]”表示例如,列表中缺少16个列表项,表示为“ 1、2、3,[。 。] 20“。目录” s“有2,000个文件。” FilesToHere“位于” C:\ user \ Documents \ ex1 \ ex 2 \“。)您可以通过以下方式分发文件:

  1. 打开“ cmd.exe”并运行
cd C:\user\Documents\FI\le\s
dir/b>../temp.txt
  1. 运行“ C:\ user \ Documents \ FI \ le \ t.bat”,其中包含
cd C:\user\Documents\FI\le\s
powershell -command "& {Get-Content ../temp.txt -TotalCount 100}" > ../temp1.bat
gvim -c "execute \"normal! 100dd\"" -c "wq" ../temp.txt
powershell -command "& {Get-Content ../temp.txt -TotalCount 100}" > ../temp2.bat
gvim -c "execute \"normal! 100dd\"" -c "wq" ../temp.txt
powershell -command "& {Get-Content ../temp.txt -TotalCount 100}" > ../temp3.bat
gvim -c "execute \"normal! 100dd\"" -c "wq" ../temp.txt
[...]
powershell -command "& {Get-Content ../temp.txt -TotalCount 100}" > ../temp20.bat
gvim -c "execute \"normal! 100dd\"" -c "wq" ../temp.txt
  1. 使用在gvim中打开的文件“ C:\ user \ Documents \ FI \ le \ x.bat”运行以下命令(如果您的一个或多个文件名包含“```”,请使用http://www.unit-conversion.info/texttools/random-string-generator/
:%s/\\/\\\\/ge | %s/^mkdir "FilesToHere/gvim -c "%%s\/^\/move \\"\/g" -c "%%s\/$\/\\" \\"C:\\\\user\\\\Documents\\\\ex1\\\\ex 2\\\\FilesToHere/g | %s/"$/\\\\\\"\/g" -c "wq" ..\/temp```.bat/g | let i=1|g/```/s//\=i/|let i=i+1
  1. 运行包含以下内容的“ C:\ user \ Documents \ FI \ le \ x.bat”
cd C:\user\Documents\FI\le\s
gvim -c "%%s/^/move \"/g" -c "%%s/$/\" \"C:\\user\\Documents\\ex1\\ex 2\\FilesToHere\\1\\\"/g" -c "wq" ../temp1.bat
gvim -c "%%s/^/move \"/g" -c "%%s/$/\" \"C:\\user\\Documents\\ex1\\ex 2\\FilesToHere\\1\\Example 1\\\"/g" -c "wq" ../temp2.bat
gvim -c "%%s/^/move \"/g" -c "%%s/$/\" \"C:\\user\\Documents\\ex1\\ex 2\\FilesToHere\\1\\2\\\"/g" -c "wq" ../temp3.bat
[...]
gvim -c "%%s/^/move \"/g" -c "%%s/$/\" \"C:\\user\\Documents\\ex1\\ex 2\\FilesToHere\\1\\Example9\\\"/g" -c "wq" ../temp20.bat
  1. 运行您已更改为包含的“ C:\ user \ Documents \ FI \ le \ x.bat”
cd C:\user\Documents\FI\le\s\
call ..\temp1.bat
[...]
call ..\temp19.bat
call ..\temp20.bat

注意:如果出现错误“'■t'未被识别为内部或外部命令,则
可运行程序或批处理文件。” (就像我在Windows 10上所做的那样),那么您必须将正在运行的任何批处理文件从Unicode转换为ANSI。 (另请参见https://www.wilderssecurity.com/threads/problem-executing-cmd-files.209442/

如果您尝试将10,000个文件移动到100个文件夹(10,000 / 100 = 100个文件/文件夹)中,而100个文件夹以不均匀的方式散布(例如,100个文件夹),我发现此方法非常有用不在一个目录中,并且100个文件夹之间具有父子关系)。相关链接/文字: