저는 여러 개의 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에서는 플래그 뒤에 파일 이름을 추가할 수 있습니다. 또한 파일 이름을 가져오기 위해 한 줄을 추가했습니다. 내 스크립트는 다음과 같습니다.
#!/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
정규식을 수행하는 더 좋은 방법이 있다는 것을 알고 있지만 이것이 효과적입니다.