如何将文件名中的“/”替换为“_”

如何将文件名中的“/”替换为“_”

我正在创建每个安装点的备份 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 

你想mvecho这里筑巢吗?命令替换的语法$(...)将使嵌套更容易:

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//\//_}"

相关内容