多数の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.7z
。 combined.7z
の内部を調べたところ、combined
というファイルが含まれています。スクリプトが機能しなかった理由は、combined.7z
に追加される各ファイルが同じファイル名で追加されているためです。
stdin
からデータを取得しているため、7zが各ファイルを追加するファイル名を指定する必要があると思います。それを行う方法はありますか?
この質問 から、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
その正規表現を実行するためのより良い方法があることは知っていますが、これは機能します。