このディレクトリのすべての.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ではエラーが発生します。パターンは、1つのファイルとのみ一致する場合に機能します。
2番目にはがありますfor f in /var/lib/libvirt/images
。for
リストされた単語を繰り返すと、ここには1つしかありません。これはディレクトリの内容自体を繰り返さない。他のコンテンツにも使用できます。たとえば、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
ただし、バックアップディレクトリが別のファイルシステムにある場合(該当する必要がある場合)、上記のタスクには圧縮ファイルを2回書き込むことが含まれます。シェルで文字列を操作すると、この問題を解決できます。
gzip "$f" > "/root/bin/backup/full/${f##*/}.gz"
もちろん、tar
ディレクトリ全体を一度にアーカイブする方法もありますが、VMイメージの場合、圧縮されたtarアーカイブから個々のファイルを抽出するための任意のアプローチがないため、多少厄介です。