我有大约 300 个 7zip 档案,每个档案都包含几个文件,但里面没有目录结构。
我需要将所有这些档案提取到与相应档案匹配的文件夹中。
例子:
foo.7z
bar.7z
提取内容foo.7z
至/foo/
提取内容bar.7z
至/bar/
我尝试了这个脚本:
find . -name "*.7z" -type f| xargs -I {} 7z x -o{} {}
但其结果是:
can not open output file ./foo.7z/file.bin
Skipping file.bin
我做错了什么?我正在使用 Ubuntu Linux。
答案1
您正在尝试创建与文件同名的目录。这行不通:不能有两个同名的目录条目。
解决此问题的一种方法是从文件中basename
删除扩展名并创建没有后缀的目录。.7z
.7z
喜欢:
for archive in *.7z; do 7z x -o"`basename \"$archive\" .7z`" "$archive"; done
答案2
要使用单个命令提取同一目录中的多个 *.7z 文件,这会将它们全部提取到与 7z 档案名称相同但不带.7z
.
7za x -o* -y *.7z
答案3
for file in *.7z; do
directory=${file/%.7z/}
if mkdir ${directory}; then
( cd ${directory}; 7z x ../${file} )
else
echo "Unable to create directory ${directory} for archive ${file}" 1>&2
fi
done
*.7z
它的工作方式是首先使用变量遍历所有文件file
。一旦它获取文件名,它就会使用 bash 字符串操作来删除末尾.7z
,并directory
从中创建一个新变量。
然后它将尝试创建目录,如果可以,它将打开一个子 shell,进入该目录并提取 7zip 档案。
如果无法创建该目录,则会向标准错误发送一条消息。
我使用子 shell,这样就不必担心由于工作目录发生更改而忘记自己的位置。
其中最深奥的部分是这一行:
目录=${文件/%.7z/}
.7z
这是前面提到的 bash 字符串操作,它将在字符串末尾查找,如果存在,则将其替换为空。如果我想用 替换它.zip
,我可以使用${file/%.7z/.zip}
。