私のホームディレクトリにあるいくつかのファイルをバックアップしたいと思います。それは
- 私のホームルートディレクトリにある単純なファイル
- ~/worthaving.txtにリストされている私の家のいくつかのディレクトリ
worthaving.txt 例:
cloud
work/web
work/python
私はこのスクリプトを作成しました:
#!/bin/bash
srce=/home/poor
dest=/run/media/poor/backup
mkdir -p $dest
cp -v $srce/* $dest/ # simple files
while IFS= read -r worth
do
mkdir -p $dest/$worth
cp -Rv $srce/$worth $dest/$worth # dirs that matters
done < "$srce/worthsaving.txt"
しかし、私が欲しいものだけでなく、私の家全体をpoor
バックアップルートの下のディレクトリに保存しました。
何が問題なの?
答え1
バックアップするファイルのリストに空白行があります。ループ内でこれは$worth
空であることを意味し、その結果、次のコマンドが実行されます。
cp -Rv /home/poor /run/media/poor/backup/
まだ明確でない場合は、ホームディレクトリ全体がターゲットpoor
のターゲットディレクトリにコピーされます。
ループの正しい外観は次のとおりです。
while IFS= read -r worth
do
if [ -n "$worth" ] && [ -d "$worth" ]
then
mkdir -p "$dest/$worth"
cp -Rv "$srce/$worth" "$dest/$worth" # dirs that matters
fi
done < "$srce/worthsaving.txt"
コメントで提案されているように、以下をすべて置き換えることができますrsync
。
rsync -rtR --files-from "$srce/worthsaving.txt" "$srce/" "$dest/"
-a
個人的には(--archive
)の代わりに-rt
()を使用したでしょうが--recursive --times
、そうしなかったのでcp -a
最小推奨フラグもそのまま使用しますrsync
。
記述子として、いつも変数を使用するときは二重引用符*を使用してください。これはシェルのトークン化とワイルドカード効果から保護します。たとえば、my bin
に割り当てられたディレクトリを繰り返すことを検討してください$worth
。二重引用符がないと、次のような正しくなく予期しないコマンドが発生します。
cp -Rv /home/poor/my bin /run/media/poor/backup/my bin
/home/poor/my
ここでは、3つのファイルまたはディレクトリ(、、現在のbin
ディレクトリ、および/run/media/poor/backup/my
)をターゲットディレクトリにコピーしようとします。bin
*少なくとも特定の状況でなぜそうしないのか理解するまでは常に。それでももう一度考えてみてください。