私は複数の7zアーカイブをインポートして単一のアーカイブにまとめる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
同じファイル名で追加されるためです。
7zを指定して、各ファイルの起動時にファイル名を追加する必要があると思いますstdin
。これを行う方法はありますか?
答え1
私はそれから学んだこの問題-si
7zでは、フラグの後にファイル名を追加できます。また、ファイル名を取得するために1行を追加しました。私のスクリプトは次のとおりです。
#!/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
正規表現を実行するより良い方法があることを知っていますが、これは効果的です。