如何在 Linux 中将多个 7zip 档案提取到同名文件夹中?

如何在 Linux 中将多个 7zip 档案提取到同名文件夹中?

我有大约 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}

相关内容