所以我正在制作一个简单的备份脚本,它将每小时运行一次。该脚本所做的就是创建一个备份目录并复制文件:
./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/