我正在创建每个安装点的备份 tar 文件:
/var
/usr/image
/usr/image/temp
我正在尝试创建类似的 tarname
backup_var_date.tar
backup_usr_image_date.tar
backup_usr_image_temp_date.tar
尝试类似下面的方法,但“mv”不起作用“$i是在for循环中调用的变量”
/bin/tar -cvpzf backup_`echo`mv "$i" "${i//"/"/_}``_`hostname`.`date +%m.%d.%Y`.tar.gz
答案1
这看起来很奇怪:
backup_`echo`mv "$i" "${i//"/"/_}``_`hostname`.`date +%m.%d.%Y`.tar.gz
你想mv
在echo
这里筑巢吗?命令替换的语法$(...)
将使嵌套更容易:
backup_$(echo $(mv this that))_$(hostname)...
但我仍然没有看到mv
这里有任何用处,更不用说它echo
只会重复mv
输出,而且如果它有效,它不应该输出任何内容。
我们可以直接取消mv
,并使用 构建文件名,这将更改变量中${var//\//_}
的所有实例。/
_
那么,对于整个循环来说,也许是这样的:
for path in /var /usr/image /usr/image/temp ; do
x=$(path#/} # remove leading / if there is one
tarfile=backup_${x//\//_}_$(hostname)_$(date +%Y-%m-%d).tar.gz
tar -cvpzf "$tarfile" "$path"
done
注意:我将日期格式从 更改为 ,05-17-2017
因为2017-05-17
后者使排序更容易。删除前导/
是多余的,因为无论如何它都会变成_
我们想要的,但我发现这种方式更加结构化。
答案2
逃跑时需要小心。使用:
"${i//\//_}"