在没有目录/文件测试的情况下递归查找和gzip目录

时间:2013-12-18 12:47:40

标签: bash backup gzip

我正在努力改进我们的bash备份脚本,并希望从rsync转向使用gzip和“查找自上次运行时间戳”系统。我希望有一个原始树的镜像,除了每个目标文件gzip。但是,如果我将目标路径传递给不存在的gzip,它会抱怨。我在下面创建了测试,但我无法相信这是最有效的解决方案。我错了吗?

另外,我对使用while read也不是很疯狂,但我无法使用我尝试的替代方法获得正确的变量扩展,例如for file in 'find' do

Centos 6.x.下面的相关剪辑,简化了焦点:

cd /mnt/${sourceboxname}/${drive}/ && eval find . -newer timestamp | while read objresults; 
  do
    if [[ -d "${objresults}" ]]
    then
    mkdir -p /backup/${sourceboxname}/${drive}${objresults}
    else
    cat /mnt/${sourceboxname}/${drive}/"${objresults}" | gzip -fc > /backup/${sourceboxname}/${drive}"${objresults}".gz
    fi
  done
touch timestamp  #if no stderr

1 个答案:

答案 0 :(得分:1)

根据我的评论中的建议更改,我建议使用以下代码:

#!/bin/bash
src="/mnt/$sourceboxname/$drive"
dst="/backup/$sourceboxname/$drive"
timestamp="$src/timestamp"
errors=$({ cd "$src" && find -newer "$timestamp" | while read objresults;
    do
        mkdir -p $(basename "$dst/$objresults")
        [[ -d "$objresults" ]] || gzip -fc < "$objresults" > "$dst/$objresults.gz"
    done; } 2>&1)
if [[ -z "$errors" ]]
then
    touch "$timestamp"
else
    echo "$errors" >&2
    exit 1
fi