だから、毎時間実行される簡単なバックアップスクリプトを作成しています。このスクリプトは、バックアップディレクトリを作成してファイルをコピーするだけです。
./backup/'$HOME'/Documents/todo.txt
バックアップ構造
- backup
- '$HOME'
- Documents
- todo.txt
- Pictures
- etc
- ....
ユーザーに接続しないように、フォルダ名にホーム変数を保持します。
これで、バックアップフォルダ内のすべてのファイルをコピーするリカバリスクリプトを作成しようとしていますが、問題は構造をエコーするときにその$HOME
部分が解析されずに直接エコーされることです。
そのエコは次のとおりです。
/$HOME/Documents/todo.txt
私はそれを次のようにエコーしたいと思います。
/home/myuser/Documents/todo.txt
バックアップファイル内の各ファイルを繰り返し、ファイルを次の場所にコピーするために使用するコードは次のとおりです。
for file in $(find backup -type f); do
echo "$file" | cut -c 7- | xargs -I {} cp $file {}
done
しかし、もちろん、$HOME
私のフォルダ内のフォルダがbackup
変数として解決されないので、これはうまくいきません。それでは、文字列の変数を解析して変数のように動作させることは可能ですか?
答え1
いくつかのヒント:
- 変数を説明するために使用されます
eval
。 find
結果を繰り返す代わりにfind -exec
。bash
代わりに部分文字列の削除を使用してくださいcut
。rsync
代わりに使用してくださいcp
。- コピーする前にディレクトリを作成してください。
find backup -type f -exec sh -c '
mkdir -p "$(eval dirname "${1#*/}")";
rsync -av "$1" "$(eval printf "${1#*/}")"
' find-sh {} \;
rsync
それとも、必要なものを正確に実行する前に使用する方が良いです。
rsync -av backup/\$HOME/ $HOME/