バッシュスクリプトエラー

バッシュスクリプトエラー

このディレクトリのすべての.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 < /.../*.qcow2gzipこれは不可能なので、Bashではエラーが発生します。パターンは、1つのファイルとのみ一致する場合に機能します。

2番目にはがありますfor f in /var/lib/libvirt/imagesforリストされた単語を繰り返すと、ここには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アーカイブから個々のファイルを抽出するための任意のアプローチがないため、多少厄介です。

関連情報