2013-07-29 103 views
1

我是新手脚本编写者。目前我有一个脚本,每天备份一个目录到一个文件服务器。它会在14天之外删除最旧的文件。我的问题是我需要它来计算实际的文件并删除第14个最旧的文件。如果文件服务器或主机关闭几天或更长时间,备份时会删除几天的备份甚至全部备份。等待停机时间。我希望它总是有14天的备份价值。Shell脚本:计数文件,删除'X'最旧的文件

我试着搜索周围,只能找到与按日期删除相关的解决方案。就像我现在所拥有的一样。

谢谢你的帮助/建议!

我的代码我有,对不起,在脚本的我第一次尝试:

#! /bin/sh 

#Check for file. If not found, the connection to the file server is down! 
if 
[ -f /backup/connection ]; 
then 
echo "File Server is connected!" 

#Directory to be backed up. 
backup_source="/var/www/html/moin-1.9.7" 
#Backup directory. 
backup_destination="/backup" 
#Current date to name files. 
date=`date '+%m%d%y'` 
#naming the file. 
filename="$date.tgz" 

echo "Backing up directory" 

#Creating the back up of the backup_source directory and placing it into the backup_destination directory. 
tar -cvpzf $backup_destination/$filename $backup_source 
echo "Backup Finished!" 

#Search for folders older than '+X' days and delete them. 
find /backup -type f -ctime +13 -exec rm -rf {} \; 

else 
echo "File Server is NOT connected! Date:`date '+%m-%d-%y'` Time:`date '+%H:%M:%S'`" > /user/Desktop/error/`date '+%m-%d-%y'` 
fi 
+0

你可能会对[rsnapshot](http://www.rsnapshot.org/)感兴趣。它使用rsync,比你的解决方案更高效。配置文件有一个参数'retain',如果你设置了'retain 14',它将始终保留最后14个备份。 – Marco

回答

0

沿着这样的东西线可能工作:

ls -1t /path/to/directory/ | head -n 14 | tail -n 1 
在ls命令

,-1是列出只是文件名(没有别的),-t是按照时间顺序(最新的第一个)列出它们。通过head命令进行管道配置只需要从ls命令的输出中获得前14个,然后tail -n 1只需从该列表中取出最后一个。这应该给予最新的第14个文件。

+0

谢谢你找到第14个文件。我已经尝试了一些添加到该行代码的东西。我希望能够删除选定的文件。我尝试添加-exec rm -rf {} \:到最后,并且不起作用。我在最后尝试了xargs rm,它似乎可以工作,但它没有做任何事情。有什么建议么? – user2630969

+0

尝试| xargs rm -rf如果你有删除文件的必要权限,那应该有效。 – mti2935

+0

[Do not parse ls](http://mywiki.wooledge.org/ParsingLs) – Marco

0

这是另一个建议。以下脚本只是列举备份。这简化了跟踪最近的备份的任务。如果你需要知道实际的创建日期,你可以简单地检查文件元数据,例如使用stat

#!/bin/sh 
set -e 

backup_source='somedir' 
backup_destination='backup' 
retain=14 
filename="backup-$retain.tgz" 

check_fileserver() { 
    nc -z -w 5 file.server.net 80 2>/dev/null || exit 1 
} 

backup_advance() { 
    if [ -f "$backup_destination/$filename" ]; then 
    echo "removing $filename" 
    rm "$backup_destination/$filename" 
    fi 

    for i in $(seq $(($retain)) -1 2); do 
    file_to="backup-$i.tgz" 
    file_from="backup-$(($i - 1)).tgz" 

    if [ -f "$backup_destination/$file_from" ]; then 
     echo "moving $backup_destination/$file_from to $backup_destination/$file_to" 
     mv "$backup_destination/$file_from" "$backup_destination/$file_to" 
    fi 
    done 
} 

do_backup() { 
    tar czf "$backup_destination/backup-1.tgz" "$backup_source" 
} 

check_fileserver 
backup_advance 
do_backup 

exit 0 
+0

谢谢mti和Marco,两种方法现在都适合我。现在我已经运行并正常工作了,我想用C++重新创建它。你认为这将是一项艰巨的任务吗?我很快就会在这里发布我的脚本,并希望我的C++编码能够像脚本那样工作! – user2630969

+0

你为什么要用编译语言重写它?这当然不难,但为什么?我想不出有什么优势,但有很多缺点(便携性较差,需要重新编译,每个系统管理员都知道shell脚本,并不都知道C++,附加工作,新代码/错误等)。我想让它更快,使用rsync或者安装'rsnapshot',因为它已经完成了所有你想要实现的工作。 – Marco

+0

没有特别的原因,只是想学习我的朋友。我觉得很有趣,看看我会如何从多种方法获得相同的结果(备份脚本)。但是,我知道你从哪里来的所有缺点。真正看到实际构建它们的优点和缺点是很好的。我是一名手/视觉学习者。谢谢你的反馈! – user2630969

相关问题