我一直在寻找一种方法来批量提取目录中的 zip 文件并根据其 zip 文件名将它们提取到单独的文件夹中。
我发现:使用 .bat 文件或 dos 命令提取目录中的所有 Zip 文件(包括子文件夹)
和:https://stackoverflow.com/questions/17077964/windows-batch-script-to-unzip-files-in-a-directory
它可以满足我的要求。但是我意识到我有一些 zip 文件需要解压到同一个目录中。例如:
base dir
|
|
> file.zip
|
> another file.zip
|
> yaf_disk1.zip
|
> yaf_disk2.zip
|
> yaf2_disk1.zip
|
> yaf2_disk2.zip
通过上述操作,我希望将 yaf_disk1 和 yaf_disk2 提取到目录 yaf 中,并将 yaf2_diskX 提取到目录 yaf2 中。
我有一个工作脚本:
for /R "." %%I in ("*.zip") do (
"%ProgramFiles%\7-Zip\7z.exe" x -y -o"%%~dpnI" "%%~fI"
)
我从上面的链接中得到了这些信息,我现在基本理解了。我不知道是否可以得到一个批处理文件来查看文件,查看末尾的 diskX,并将所有具有相同名称和 diskX 的文件提取到它从这些文件创建的第一个目录中?
如果这很重要的话,我正在使用 Windows 10。
答案1
别担心,我创建了一个 Python 脚本来帮我完成这件事。如果有人遇到这种情况并需要类似的东西,这是我的代码:
import glob, os, zipfile
zipfiles = glob.glob("*.zip") ## find all files with zip extension in current directory
count = 0 ## current file
while (count < len(zipfiles)):
print ("Extracting file: "+zipfiles[count])
zipRef = zipfile.ZipFile(zipfiles[count]) ## make ready for extraction
directoryToMake = zipfiles[count] ## iniital name for extraction directory
isMultiDisk = zipfiles[count].find('Disk') ## search for 'Disk' in the directory name and store location
if (isMultiDisk > 0): ## has found 'Disk' in the name
print("Multi Disk")
if (len(directoryToMake[isMultiDisk+4:-4]) < 2): ## checks to see if the disk number is more than 2 characters long
## not actually checking the number just the number of characters
## to account for some names being DiskA rather than Disk1
directoryToMake = directoryToMake[:-10] ## remove everything after the Disk to make the clean directory name
else:
directoryToMake = directoryToMake[:-11] ## remove extra char for disk numbers of 2 digits
else: ## disk not found in name
print("Single Disk")
directoryToMake = directoryToMake[:-4] ## just remove the .zip at the end
if not os.path.exists(directoryToMake): ## check if directory exists
print("Creating Directory: " + directoryToMake)
os.makedirs(directoryToMake) ## if not make it
print("Extracting files into directory: " + directoryToMake+ "\n")
zipRef.extractall(directoryToMake) ## extract into directory
count += 1