每 20 个文件自动创建 subfolders/zip

Create subfolders/zip every 20 files automatically

我有一个巨大的文件夹,我想将其转换为多个小文件夹,每个文件夹包含 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,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 部分不工作( 相同的错误 )。这部分对我来说很模糊,欢迎提供一些帮助。
我指定文件 temp.txt 包含我的完整文件列表,没有任何分隔符(每行一个文件)。

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

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

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

如果你知道如何直接压缩每 20 个文件(不通过创建子文件夹),我也同意!

提前感谢您的帮助!

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

所以,回答我的基本问题是:在一个包含数千个文件的大文件夹中,如何压缩子文件夹中的每 20 个文件? 有必要(对我来说知识)到:

  1. 每20个文件创建一个sub-folder文件名没有空格代码在我的)
  2. 一一压缩所有这些子文件夹(代码在我的

大功告成!

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

无需创建文件夹。只需遍历文件并将每个文件添加到它指定的 zip 文件中(而不是将每 20 个文件复制到一个文件夹中并压缩该文件夹) 使用两个计数器来跟踪(源)文件和 zip 文件。一个文件计数器(使用 Modulo-operator 检查每 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-filename(如"%zipDest%\MyZips-!foldercounter:~-4!.zip"

注意:我使用 ECHO 解除了 7zip 命令以进行测试和故障排除。当输出满足您时,删除 ECHO

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

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

引号应注意所有空格。