如何将多个 7z 存档合并为一个?

如何将多个 7z 存档合并为一个?

我正在尝试制作一个 bash 脚本,该脚本需要大量 7z 档案并将它们组合成一个档案。这是我到目前为止所拥有的。

#!/bin/bash
DUMPPATH="/home/backups/dumps/"
NEWPATH=$DUMPPATH"combined/"
FILETYPE="*.7z"
DATE="$(date +%Y-%m-%d-%H-%M-%S)"
NEWNAME=$NEWPATH"AllAsOf"$DATE".7z"
for FILE in $(ls $DUMPPATH$FILETYPE)
do
        echo -n $FILE"..."
        7z e $FILE -so | 7z a -si -mx=9 $NEWNAME
        if [ $? -eq 0 ]; then
                echo "Done."
        else
                echo "Something broke"
                exit
        fi
done

当我运行脚本时,我得到了Error: Duplicate filename,所以我尝试只运行脚本的核心部分: 7z e /home/backups/dumps/foo.7z -so | 7z a -si -mx=9 /home/backups/dumps/combined/combined.7z。我查看了里面combined.7z,它包含一个名为combined.我的脚本不起作用的原因是添加到的每个文件combined.7z都使用相同的文件名添加。

我认为我需要指定 7z 添加每个文件内的文件名,因为它从stdin.有没有办法做到这一点?

答案1

我从中学到了这个问题-si我可以在 7z 中的标志后面添加文件名。我还添加了一行来获取文件名。我的脚本变成:

#!/bin/bash
DUMPPATH="/home/backups/dumps/"
NEWPATH=$DUMPPATH"combined/"
FILETYPE="*.7z"
DATE="$(date +%Y-%m-%d-%H-%M-%S)"
NEWNAME=$NEWPATH"AllAsOf"$DATE".7z"
for FILE in $(ls $DUMPPATH$FILETYPE)
do
        echo -n $FILE"..."
        THISNAME=$(echo $FILE | sed "s|.*"$DUMPPATH"||" | sed "s/\.7z.*//")
        7z e $FILE -so | 7z a -si$THISNAME -mx=9 $NEWNAME
        if [ $? -eq 0 ]; then
                echo "Done."
        else
                echo "Something broke"
                exit
        fi
done

我知道有更好的方法来执行正则表达式,但这可行。

相关内容