我有一个 7z 存档文件,它在“根”级别包含几个文件,然后是一个目录,该目录又包含文件和文件夹,如下所示:
- file1.txt
- file2.txt
- my_dir
- file3.txt
- file4.txt
- another_dir
- file5.txt
- file6.txt
我想知道是否有一个命令可以让我提取内容在my_dir
我选择的目录中,最终结果是:
- target_dir
- file3.txt
- file4.txt
- another_dir
- file5.txt
- file6.txt
我已经尝试过以下命令:
7za x -y archive.7z -o/path/to/target_dir my_dir
7za x -y archive.7z -o/path/to/target_dir 'my_dir/*'
但都创建了这个目录结构:
- target_dir
- my_dir
- file3.txt
- file4.txt
- another_dir
- file5.txt
- file6.txt
答案1
是否有一个命令可以将 my_dir 提取到指定目录?
是的。请使用该e
选项代替x
:
7za e -y archive.7z -o/path/to/target_dir my_dir
(x
是提取自完整路径)
e(提取)命令
将文件从存档提取到当前目录或输出目录。输出目录可以通过 -o(设置输出目录)开关指定。
此命令将所有解压的文件复制到一个目录中。如果要使用完整路径提取文件,则必须使用 x(使用完整路径提取)命令。
来源e(提取)命令
但实际上档案中的文件夹包含我想要保留的子文件夹
在这种情况下您需要使用原始命令(带有x
),然后使用move
将内容移动my_dir
到上一级。
类似于以下批处理文件(未经测试):
@echo off
7za x -y archive.7z -o/path/to/target_dir my_dir
move /y my_dir\* /path/to/target_dir
rd /s my_dir
endlocal
从命令行:
7za x -y archive.7z -o/path/to/target_dir my_dir && move /y my_dir\* /path/to/target_dir && rd /s my_dir
但是我使用的是 Linux!
然后要使用的命令是:
#!/bin/bash
7za x -y archive.7z -o/path/to/target_dir my_dir
mv -f my_dir/* /path/to/target_dir
rmdir my_dir
或者:
7za x -y archive.7z -o/path/to/target_dir my_dir && mv -f my_dir/* /path/to/target_dir && rmdir my_dir
bash
比我更了解的人也许可以简化这一点。
进一步阅读
答案2
管理多个档案
不确定在第一次提出问题时这是否可行,但有一个更简单的解决方案,可以同时使用x
和e
(x
保留文件夹结构,e
展平所有内容,因此您要查找的是x
):
7z x archive.7z -opath/to/dir
两个开关(这里、x
和-o
)都支持通配符:
7z x *.7z -o*
这会将当前目录中的所有 .7z 档案提取到具有相同名称的新子目录中。
来源:-o(设置输出目录)开关
过滤仅提取文件夹
如果要过滤的文件类型已知,例如.txt
您的示例,7z x archive.7z -opath/to/dir -x!*.txt
则可行。或者,您可以过滤掉所有包含点 ( .
) 的名称,这样每个文件都会被排除: 。请注意,这还会过滤掉名称中7z x archive.7z -opath/to/dir -x!*.*
包含点 ( ) 的任何文件夹.