我的目录中包含多个.tar
个文件,这些文件包含多个.zip
个文件。树结构有点像这样:
testDirectory
-tarArchive.tar
-directory1
-zipArchive11.zip
abc.XML
1.TIF
2.TIF
...
-zipArchive12.zip
xyz.XML
a.TIF
b.CDX
...
.
.
.
-directory2
-zipArchive21.zip
...
-zipArchive22.zip
...
.
.
.
.
.
我需要一个批处理脚本来递归地从每个.XML
中提取.zip
,同时保持树结构(首先,所有.zip
将从主.tar
中提取,然后每个.XML
只有.zip
。此外,之后应删除已处理的档案。
我可以使用此代码实现大部分内容
for /R "C:\Users\frozenfyr\Desktop\test" %%I in ("*.zip", "*.tar") do (
"C:\Program Files\7-Zip\7z.exe" x -y -o"%%~dpI" "%%~fI" && del "%%~fI"
)
除了两件事:
我无法仅提取.XML
个文件。
"C:\Program Files\7-Zip\7z.exe" x -y -o"%%~dpI" "%%~fI"
"*.zip" -r
会
不提取XML文件和
"C:\Program Files\7-Zip\7z.exe" x -y -o"%%~dpI" "%%~fI"
的 "*.XML" -r
不会(不应该)工作,因为.tar
文件中没有任何内容匹配。
有没有办法做类似的事情
"C:\Program Files\7-Zip\7z.exe" x -y -o"%%~dpI" "%%~fI"
"*.zip" "*.XML" -r
处理后不会删除主.tar
文件。我试过这个
.zip
文件上的脚本,它可以工作(它们会被删除
处理)。
我已经尝试了powershell script,但我对此并不十分满意。我觉得批处理脚本很容易让我处理。我甚至找到了post on SU,但它没有提到多种特定的格式/文件。我看了Command Line Version User's Guide并考虑了-x
switch,但这没用。
我不能在这里引用所有引用,但我确实经历了很多SO和SU帖子,Google这次可能不是我的朋友。我不确定SO或SU是否应该成为提出这个问题的地方,我在两个社区都找到了很好的参考。我经常使用SO,所以我在这里。
请帮帮我,这让我发疯了..
答案 0 :(得分:2)
我能够解决我的第一个问题。第二个看起来有点复杂。 del
命令适用于较小的归档。因为我的.tar
很大(> 1GB),我认为下一个循环在命令可以删除存档之前开始执行。如果不是其他任何人在这里作为未来的指南得到答案,那将对我有好处。
无论如何,对于第一个问题,我发现我需要使用switch -x
进行递归,即-xr
,因为我有多个我想要跳过的扩展,我必须创建ignore.txt
并在那里添加所有例外。我的完整脚本看起来像这样:
for /R "C:\Users\frozenfyr\Desktop\test" %%I in ("*.zip", "*.tar") do (
"C:\Program Files\7-Zip\7z.exe" x -y -xr@"C:\Users\frozenfyr\Desktop\ignore.txt" -o"%%~dpI" "%%~fI" && del "%%~fI"
)
如果我只有一个我想忽略的扩展名,我会-xr!"*.extension"
而不是-xr@"C:\Users\frozenfyr\Desktop\ignore.txt"
顺便说一下,-xr
不会阻止7zip处理被排除的文件,它可能会在解压缩后将其删除,因为我在命令提示符下看到了extracting abc.TIF
。
答案 1 :(得分:1)
7z e -an -air!*.rar -r -oF:\target
将所有tar文件从当前目录的子文件夹(递归地)提取到目标文件夹F:\ target中。
答案 2 :(得分:0)
为了递归读取zip文件,我使用的是“Swiss File Knife”。如果您可以在系统上安装其他软件,这可能是个主意吗?