여러 7z 아카이브를 하나로 병합하는 방법은 무엇입니까?

여러 7z 아카이브를 하나로 병합하는 방법은 무엇입니까?

저는 여러 개의 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

나는 그것으로부터 배웠다이 문제-si7z에서는 플래그 뒤에 파일 이름을 추가할 수 있습니다. 또한 파일 이름을 가져오기 위해 한 줄을 추가했습니다. 내 스크립트는 다음과 같습니다.

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

정규식을 수행하는 더 좋은 방법이 있다는 것을 알고 있지만 이것이 효과적입니다.

관련 정보