解析名称中包含 $HOME 的文件夹结构

解析名称中包含 $HOME 的文件夹结构

所以我正在制作一个简单的备份脚本,它将每小时运行一次。该脚本所做的就是创建一个备份目录并复制文件:

./backup/'$HOME'/Documents/todo.txt

备份结构

- backup
    - '$HOME'
        - Documents
             - todo.txt
        - Pictures
    - etc
        - ....

我将 home 变量保留在文件夹的名称中,这样它就不会绑定到一个用户。

现在,我正在尝试制作一个恢复脚本,该脚本复制备份文件夹中的所有文件,但我的问题是,当我回显结构时,该$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/

相关内容