なぜ家族全体がバックアップされますか?

なぜ家族全体がバックアップされますか?

私のホームディレクトリにあるいくつかのファイルをバックアップしたいと思います。それは

  • 私のホームルートディレクトリにある単純なファイル
  • ~/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


*少なくとも特定の状況でなぜそうしないのか理解するまでは常に。それでももう一度考えてみてください。

おすすめ記事