批量移动 zip 文件列表内容至根目录

批量移动 zip 文件列表内容至根目录

我有大约 8,000 个 Zip 文件,每个文件里面都有一个同名的文件夹。它们看起来像这样

Example #1.zip
  └─ Example #1
      ├─ 1.png
      ├─ 2.png
      └─ 3.png

有没有办法将文件夹内的文件移动到 Zip 的根目录,然后删除现在为空的文件夹?结果应该是这样的

Example #1.zip
  ├─ 1.png
  ├─ 2.png
  └─ 3.png

答案1

对于在 2023 年发现此问题的人,需要对 Senor CMasMas 批处理脚本的提取命令进行更正,如下所示:

@echo off
Set WildCard=*.zip
Set ZipFileDir=%~DP0
Set FixedZipFilesDir=%ZipFileDir%Fixed
Set ProcessedZipFilesDir=%ZipFileDir%Processed
Set WorkingDir=%ZipFileDir%temp

md "%WorkingDir%"
md "%FixedZipFilesDir%"
md "%ProcessedZipFilesDir%"

REM Loop on zips in the directory.. call fn ProcessZip with each name
for %%f in (%WildCard%) do call :ProcessZip "%%f"

REM Clean up our temp working space and exit
rd /s /q "%WorkingDir%"
goto :EOF

:: --------------------------------------------------
REM Function to process each zip file found.
:: --------------------------------------------------
:ProcessZip
Set InputZipPath=%~DP1
Set InputZipName=%~N1

REM Extract the file to our temporary working directory
7z x "%InputZipPath%%InputZipName%.zip" -o"%WorkingDir%"
REM Create a new zip excluding the path
7z a "%FixedZipFilesDir%\%InputZipName%.zip" "%WorkingDir%\%InputZipName%\*"
REM Move the original zip to our processed folder.
move "%InputZipPath%%InputZipName%.zip" "%ProcessedZipFilesDir%"
goto :EOF

答案2

假设Example #1.zip实际上是一个文件夹(来自解压),而不是 zip 文件:

cd "Example #1.zip"
for /r %f in (*.png) do move "%f" .

(您可以将这些行按原样输入到命令提示符中。如果您从 .cmd 文件运行它们,则需要在两个地方都使用%%f而不是%f。)

如果文件仍处于压缩状态,则可能需要解压缩它们而不使用路径名,然后重新压缩。您可以使用无压缩/店铺选项为 .png 无论如何都不会显著压缩。

答案3

我编写了以下批处理文件,它可以解决您尝试修复的问题。它将获取目录结构与 zip 文件本身的名称匹配的 zip 文件,并创建不匹配的 zip 文件。我只制作了 5 个来测试,但它确实非常快,完成后会留下两个整洁的“已处理”和“已修复”文件夹。

  • 您将需要命令行版本7zip7z.exe7za.exe)在您的路径中,或与 zip 文件和批处理文件位于同一目录中。如果您已将7za.exe其重命名为7z.exe
  • 在运行之前,您应该将您的 zip 文件复制到其他地方(以防万一!)
  1. 它将 zip 文件放在与批处理文件相同的目录中。
  2. 它每次将压缩文件解压一个。
  3. 它会压缩一个新的 zip 文件,并期望其中有一个与 zip 文件本身同名的目录,并将其压缩到名为“Fixed”的子文件夹中。
  4. 它将旧的 zip 文件移动到名为“Processed”的文件夹中。

这里的安全措施很少。文件夹中只有符合您方案的 zip 文件。很容易修复,但我没有费心保护任何东西。

@echo off
Set WildCard=*.zip
Set ZipFileDir=%~DP0
Set FixedZipFilesDir=%ZipFileDir%Fixed
Set ProcessedZipFilesDir=%ZipFileDir%Processed
Set WorkingDir=%ZipFileDir%temp

md "%WorkingDir%"
md "%FixedZipFilesDir%"
md "%ProcessedZipFilesDir%"

REM Loop on zips in the directory.. call fn ProcessZip with each name
for %%f in (%WildCard%) do call :ProcessZip "%%f"

REM Clean up our temp working space and exit
rd /s /q "%WorkingDir%"
goto :EOF

:: --------------------------------------------------
REM Function to process each zip file found.
:: --------------------------------------------------
:ProcessZip
Set InputZipPath=%~DP1
Set InputZipName=%~N1

REM Extract the file to our temporary working directory
7z x "%InputZipPath%%InputZipName%.zip" -o%WorkingDir%
REM Create a new zip excluding the path
7z a "%FixedZipFilesDir%\%InputZipName%.zip" "%WorkingDir%\%InputZipName%\*"
REM Move the original zip to our processed folder.
move "%InputZipPath%%InputZipName%.zip" "%ProcessedZipFilesDir%"
goto :EOF

相关内容