名前に$ HOMEを含むフォルダ構造を確認する

名前に$ HOMEを含むフォルダ構造を確認する

だから、毎時間実行される簡単なバックアップスクリプトを作成しています。このスクリプトは、バックアップディレクトリを作成してファイルをコピーするだけです。

./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/

関連情報