Linux shell脚本如何使用相同的输出进行第二次操作

时间:2014-01-10 22:59:22

标签: linux

此脚本已于24小时后创建备份文件(午夜crontab),但我担心的是,在创建第一个tar(首次查找)时,正在创建大量“”文件,所以当执行第二次查找,它将删除比第一次更多的文件,因此删除的文件将超过备份。

2014年2月4日编辑的脚本,专注于删除临时文件中列出的文件的循环

    #!/bin/sh
    DATE=`date '+%Y%m%d'`
    LOCATION=/home/see/rbirun/send/VPN/Mobile/
    FILE="cdr_backup_${DATE}.tar.gz"
    TEMPFILE="tempfile_${DATE}"
    ERROR="Error:Tar file not created nor removed the source call records"
    cd "${LOCATION}"
    find . -name 'VPN_CALLRECORD*' -type f -ctime 1 -print > ${TEMPFILE}
    tar -czf ${FILE} -T ${TEMPFILE}
    if [ -f $FILE ];
    then

            number=$(more ${TEMPFILE} |wc -l)
            echo "$DATE:Number of files backed up-->$number ">>log_after_cdr_backup.txt
            while IFS= read -r line
            do
                rm -f $line
            done < "${TEMPFILE}"
    else
            echo "$DATE:$ERROR">>log_after_cdr_backup.txt
    fi             

有没有办法确保删除相同的源备份?也许使用'xargs'?

提前感谢您的宝贵帮助

2 个答案:

答案 0 :(得分:0)

如果您有足够的空间,首先将找到的文件移动到工作文件夹中,然后在备份后删除工作文件夹。

答案 1 :(得分:0)

您的问题是您运行find两次。在第一次调用和第二次调用之间可能发生任何事情。

做这样的事情:

#!/bin/sh
DATE=`date '+%Y%m%d'`
FILE="cdr_backup_${DATE}.tar.gz"
DESTINATION=/root/patrick_temp/
ERROR="Tar file has not been created nor removed the source call records"

BACKUP_FILES=$(find . -name 'VPN_CALLRECORD*' -type f -ctime 1 -print)
tar -czvf ${FILE} ${BACKUP_FILES}
if [ -f $FILE ];
then
    mv cdr_backup* ${DESTINATION}
    rm -rf ${BACKUP_FILES}
else
    echo $ERROR 
fi

如果您要备份 LOTS 文件,可以将文件名写入临时文件,使用该文件进行tar调用,然后使用循环删除列出的所有文件在临时文件中。

根据您最近的更新进行编辑。

#!/bin/sh
DATE=`date '+%Y%m%d'`
LOCATION=/home/see/rbirun/send/VPN/Mobile/
FILE="cdr_backup_${DATE}.tar.gz"
# use mktemp to make the temp file. This is more secure and better practice.
TEMPFILE=$(mktemp)  # --tmpdir lets you place the created temp file wherever you need it
ERROR="Error:Tar file not created nor removed the source call records"

cd "${LOCATION}"

find . -name 'VPN_CALLRECORD*' -type f -ctime 1 -print > ${TEMPFILE}

tar -czf ${FILE} -T ${TEMPFILE}

# first, cleanup temps

# no need for `more` here. Also, `cat` is more typically used when this is needed
number=$(wc -l ${TEMPFILE})  
echo "$DATE:Number of files backed up-->$number ">>log_after_cdr_backup.txt
for line in $(cat ${TEMPFILE})
do
    rm -f $line
done
rm ${TEMPFILE}

# now process activity

if [ ! -f $FILE ];
then
    echo "$DATE:$ERROR">>log_after_cdr_backup.txt
    exit 1
fi

我希望这能解决你的问题。