Bash正在将自动文件创建合并为一个大文件?

时间:2012-07-20 15:10:26

标签: linux bash

我正在使用的脚本:

DISKS=$(df -H | awk '{print $1}' | grep "/dev/" | sed 's/[/]/_/g' | sed 's/^.//' | sed 's/%$//')
IFS="\n\b"
for i in $DISKS; do
  rrdtool create $(echo $i + "_usage.rrd") --start $(date +%s) DS:used:GAUGE:240:U:U RRA:MAX:0.5:1:144 RRA:MAX:0.5:1:1008 RRA:MAX:0.5:1:8640
done;

命令行上的文件:

dev_sda2?dev_sdd1?dev_sdc1?dev_mapper_truecrypt1?dev_mapper_truecrypt2 + _usage.rrd

之前有没有人经历过这种情况,发生了什么?

3 个答案:

答案 0 :(得分:1)

DISKS=$(df -H | awk '{print $1}' | grep "/dev/" | sed 's/[/]/_/g' | sed 's/^.//' | sed 's/%$//');
while read i; rrdtool ...; done <<<"$DISKS"

答案 1 :(得分:0)

我不熟悉rrdtool,但修复文件名可能会有所帮助。

do rrdtool create $(echo $i + "_usage.rrd")

打印出错误的值,请尝试:

do rrdtool create $(echo "$i"_usage.rrd)

希望修复文件名(并从文件名中删除'+'符号和空格)将有助于清理它。

答案 2 :(得分:0)

首先,您不需要命令替换来创建文件名:

rrdtool create "${i}_usage.rrd" ...

应该可以正常工作。

真正的问题似乎是DISKS没有像你期望的那样分裂。尝试

DISKS=( $(your-pipeline-here) )
for i in "${DISKS[@]}"; do
  rrdtool create ...
done;

这使得DISKS成为一个数组,而不是一个以空格分隔的字符串,让您迭代数组而不必担心(尽可能多)IFS的值。