我想删除除当前日志和之前的日志之外的所有日志。 这些日志文件在20分钟后创建。因此文件名称就像
abc_23_19_10_3341.log
abc_23_19_30_3342.log
abc_23_19_50_3241.log
abc_23_20_10_3421.log
其中23是今天的日期(也可能包括昨天的日期) 19是小时(7点钟),10,30,50,10是会议记录。
在这种情况下,我想要保留abc_23_20_10_3421.log这是当前日志(当前正在写入)和abc_23_19_50_3241.log(前一个) 并删除其余的。
我通过创建一个文件夹,将第一个文件放在该文件夹中并删除文件然后删除它来实现它。但是这太长了......
我也试过这个
files_nodelete=`ls -t | head -n 2 | tr '\n' '|'`
rm *.txt | egrep -v "$files_nodelete"
但它没有用。但如果我把ls代替rm就可以了。
我是linux的业余爱好者。所以请提出一个简单的想法......或者是一个逻辑......我试过但是它没有用。
同时阅读有关mtime的内容,但由于我是linux新手,因此看起来很复杂。
使用solaris系统
答案 0 :(得分:1)
在Solaris中尝试使用logadm工具,这可能是轮换日志的最简单方法。如果你只想完成任务,那就可以了。
http://docs.oracle.com/cd/E23823_01/html/816-5166/logadm-1m.html
答案 1 :(得分:1)
使用ls指向文件通常不是一个好主意。有些文件可能会造成破坏(名称中带有[换行符]或奇怪字符的文件是通常的例子....)。
使用shell globs:这是一种有趣的方式:我们计算的文件比我们要删除的文件更新!
pattern='abc*.log'
for i in $pattern ; do
[ -f "$i" ] || break ;
#determine if this is the most recent file, in the current directory
# [I add -maxdepth 1 to limit the find to only that directory, no subdirs]
if [ $(find . -maxdepth 1 -name "$pattern" -type f -newer "$i" -print0 | tr -cd '\000' | tr '\000' '+' | wc -c) -gt 1 ];
then
#there are 2 files more recent than $i that match the pattern
#we can delete $i
echo rm "$i" # remove the echo only when you are 100% sure that you want to delete all those files !
else
echo "$i is one of the 2 most recent files matching '${pattern}', I keep it"
fi
done
我只使用globbing机制将文件名提供给“find”,只使用-printf0的终止“0”来计算输出的文件名(因此我对这些文件名中的任何特殊字符都没有问题,我只是需要知道输出了多少文件)
tr -cd "\000"
将仅保留\000
,即由print0输出的终止NUL字符。然后,我将每个\000
翻译为单个+
字符,并使用wc -c
计算它们。如果我看到0,“$ i”是最新的文件。如果我看到1,“$ i”就是那个稍微老一点(所以发现只看到最近的一个)。如果我看到超过1,这意味着我们要保留的2个文件(数学模式)比“$ i”更新,所以我们可以删除“$ i”
我确信有人会介入一个更好的,但我想这个想法可以重复使用...
答案 2 :(得分:1)
如果你想要一个类似(但有效)的解决方案,试试这个:
ls abc*.log | sort | head -n-2 | xargs rm
ls abc*.log
:列出匹配模式abc*.log
的所有文件
sort
:将此列表按字典(按名称)从oldes排序到最新的日志文件
head -n-2
:返回列表中最后两个条目以外的所有条目(您也可以给-n
一个否定计数)
xargs rm
:使用stdin
rm
命令
如果目录中有两个或更少的文件,此命令将返回错误,如
rm: missing operand
并且不会删除任何文件。
答案 3 :(得分:0)
感谢guyz的所有答案。 我找到了答案
files=`ls -t *.txt | head -n 2 | tr '\n' '|' | rev |cut -c 2- |rev`
rm `ls -t | egrep -v "$files"`
感谢您的帮助