배쉬 스크립트 오류

배쉬 스크립트 오류

이 디렉터리의 모든 .qcow2 확장자를 백업하는 동안 오류가 발생합니다. 디렉터리의 모든 항목을 어떻게 다르게 백업할 수 있나요?

내 스크립트와 오류는 다음과 같습니다.

#!/bin/bash

for (( i =1; i<5; i++))
    do
            gzip < /var/lib/libvirt/images/*.qcow2 > /root/bin/backup/full/vm$i.qcow2.backup.gz
    done

./assnBackup.bash: line 5: /var/lib/libvirt/images/*.qcow2: ambiguous redirect
./assnBackup.bash: line 5: /var/lib/libvirt/images/*.qcow2: ambiguous redirect
./assnBackup.bash: line 5: /var/lib/libvirt/images/*.qcow2: ambiguous redirect
./assnBackup.bash: line 5: /var/lib/libvirt/images/*.qcow2: ambiguous redirect

foreach 스크립트:

#!/bin/bash

i=0

for f in /var/lib/libvirt/images
    do
            gzip < $f > /root/bin/backup/full/vm$i.qcow2.backup.gz
            i=$((i++))
    done

문제를 해결하세요:

#!/bin/bash

i=0

file=/var/lib/libvirt/images/*

for f in $file
do
gzip < $f > /root/bin/backup/full/vm$i.qcow2.backup.gz
    i=$((i + 1))
done

답변1

그럼요.

디렉터리에 여러 파일이 있는 경우 모든 파일에 대한 입력을 리디렉션하려고 시도합니다 gzip < /.../*.qcow2. gzip이는 불가능하므로 Bash에서는 오류가 발생합니다. 패턴은 하나의 파일과만 일치하는 경우 작동합니다.

두 번째에는 가 있습니다 for f in /var/lib/libvirt/images. for나열된 단어를 반복하면 여기에는 하나만 있습니다. 이는 디렉토리의 내용 자체를 반복하지 않습니다. 다른 내용에도 사용할 수 있습니다. 예를 들어 for s in foo bar blah ; do echo $s ; done와일드카드 패턴을 사용하여 디렉토리의 모든 파일 이름을 확장하도록 쉘에 명시적으로 지시해야 합니다. for f in /var/lib/libvirt/images/*.qcow2이름이 다음으로 끝나는 각 파일에 대해 루프가 실행되고 .qcow2파일 f이름이 저장됩니다.


이제 gzip최소한 작동할 것입니다. 백업 복사본을 만들 때 실제로 원본 파일 이름을 삭제하려는지 여전히 알고 싶습니다.

다음을 수행할 수 있습니다.

gzip -k "$f" && mv "$f.gz" /root/bin/backup/full/

gzip.gz기본적으로 압축 파일은 원래 파일 이름에 확장명이 추가되어 생성됩니다 . 일반적으로 원본 파일도 함께 삭제하지만 -k보관하라고 알려줍니다. 그런 다음 압축된 복사본을 다른 곳으로 옮깁니다. 따라서 백업 디렉터리에 foo.qcow2 있게 됩니다 .foo.qcow2.gz

그러나 백업 디렉터리가 다른 파일 시스템에 있는 경우(해당해야 함) 위의 작업에는 압축 파일을 두 번 쓰는 작업이 포함됩니다. 셸에서 문자열을 조작하면 이 문제를 해결할 수 있습니다.

gzip "$f" > "/root/bin/backup/full/${f##*/}.gz"

물론 tar디렉토리 전체를 한번에 아카이브하는 방법도 있지만, VM 이미지의 경우 압축된 tar 아카이브에서 개별 파일을 추출하기 위한 임의 접근이 없기 때문에 다소 어색할 수 있다.

관련 정보