web-dev-qa-db-ja.com

複数の7zアーカイブを1つに組み合わせるにはどうすればよいですか?

多数の7zアーカイブを取得して1つのアーカイブに結合するbashスクリプトを作成しようとしています。これが私がこれまでに持っているものです。

#!/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.7zcombined.7zの内部を調べたところ、combinedというファイルが含まれています。スクリプトが機能しなかった理由は、combined.7zに追加される各ファイルが同じファイル名で追加されているためです。

stdinからデータを取得しているため、7zが各ファイルを追加するファイル名を指定する必要があると思います。それを行う方法はありますか?

2
aswine

この質問 から、7zの-siフラグの後にファイル名を追加できることを学びました。ファイル名を取得する行も追加しました。私のスクリプトは次のようになりました。

#!/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

その正規表現を実行するためのより良い方法があることは知っていますが、これは機能します。

1
aswine