每20个文件自动创建一个子文件夹/ zip

问题描述

我有一个很大的文件夹,我想将其转换成几个小文件,每个文件20个并压缩。我想使用批处理文件和7zip自动执行此操作。

要实现这一目标,我考虑了2个步骤

1。为每20个文件创建一个文件source):

@echo off
set /a counter=1
set /a filesperfolder=20
cd "C:\Users\Desktop\dir\"
:loopstart
set dirname=dir_%counter%
md %dirname%
echo %dirname%

dir /b | findstr /v /i "dir_*"> %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 20 goto done

goto loopstart

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

很遗憾,此操作不起作用:The Syntax of the command is incorrect.。我试过通过删除@echo off来调试脚本,它告诉我dir /b | findstr /v /i "dir_*"> %temp%\temp.txt && for /l %%l in (1,2* delims=:" %%a in ('findstr /n /r "^" %temp%\temp.txt ^| findstr /r "^%%l:"') do @move %%b %dirname%\%%b >nul部分无法正常工作(相同错误)。这部分对我来说很模糊,欢迎您提供一些帮助。
我指定文件 temp.txt 包含完整的文件列表,没有任何分隔符(每行一个文件)。

---更新:文件名不能包含空格---

2。用(source)逐个压缩所有这些子文件
for /D %d in (*.*) do 7z a -tzip "%d.zip" ".\%d\*"

您是否有一个想法(我总结一下):为大量文件创建20个文件的子文件,以便逐个压缩每个子文件夹。

如果您对如何直接压缩每个20个文件有任何想法(无需创建子文件夹),我也同意!

预先感谢您的帮助!

解决方法

已解决!
我发现了我的错误。实际上,我的文件包含脚本无法容纳的空间。

因此,要回答我的基本问题:在一个装有数千个文件的大文件夹中,如何压缩子文件夹中的每个20个文件?(据我所知)有必要:

  1. 为每个20个文件创建一个子文件夹名称没有空格的(我的question中的代码
  2. 一个个地压缩所有这些子文件夹(我的question 中的代码)

就完成了!

如果您知道“更快”的解决方案,请毫不犹豫地提出解决方案。

,

无需创建文件夹。只需遍历文件并将每个文件添加到指定的zip文件中即可(而不是将每20个文件复制到一个文件夹中并对该文件夹进行zip压缩) 使用两个计数器来跟踪(源)文件和zip文件。一个用于文件的计数器(使用Modulo运算符检查每个20),另一个用于zip文件名。我用10001而不是1开头的zip文件名,并使用其中的最后四个字符来获得可排序的文件名(0001.zip等)。

@echo off 
setlocal enabledelayedexpansion
set filesperfolder=20
cd /d "%cd%"
set "zipDest=C:\temp"
set filecounter=0
set foldercounter=10001

for %%a in (*) do (
  set /a filecounter+=1
  set /a check=filecounter %% filesperfolder
  if !check! == 0 set /a foldercounter+=1
  ECHO 7z a -tzip "%zipDest%\!foldercounter:~-4!.zip" "%%a"
)

显然改用cd /d行(源文件夹),目标文件夹(注意:不要使用源文件夹,否则您的zip文件可能会再次压缩成其他zip文件),也许还有zip文件名(例如"%zipDest%\MyZips-!foldercounter:~-4!.zip"

注意:我用ECHO取消了7zip命令的测试和故障排除。输出满足您要求时,请移除ECHO

要在成功压缩每个文件后删除每个文件 ,请将压缩行更改为:

7z a -tzip "%zipDest%\!foldercounter:~-4!.zip" "%%a" && del "%%a"

引号应包含空格。