Rm 和 Egrep -v 组合

Rm and Egrep -v combo

我想删除除当前日志和之前日志之外的所有日志。 这些日志文件是在 20 minutes.So 之后创建的,文件名类似于

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(前一个) 并删除其余部分。

我通过创建一个文件夹,将第一个文件放入该文件夹并删除文件然后删除 it.But 太长了...

我也试过这个

files_nodelete=`ls -t | head -n 2 | tr '\n' '|'`
rm *.txt | egrep -v "$files_nodelete" 

但它没有 work.But 如果我用 ls 而不是 rm 它会起作用。

我是 linux.So 的业余爱好者,请提出一个简单的想法..或逻辑..xargs rm 我试过了,但没有用。

还阅读了有关 mtime 的内容,但似乎有点复杂,因为我是 linux

的新手

在 solaris 系统上工作

试试 Solaris 中的 logadm 工具,它可能是轮转日志的最简单方法。如果你只是想把事情做好,它会做到。

http://docs.oracle.com/cd/E23823_01/html/816-5166/logadm-1m.html

使用 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 '[=10=]0' | tr '[=10=]0' '+' | 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 "[=11=]0" 将只保留 [=12=]0,即 print0 输出的终止 NUL 字符。然后我将每个 [=12=]0 翻译成一个 + 字符,并用 wc -c 来计算它们。如果我看到 0,则“$i”是最新的文件。如果我看到 1,则“$i”是稍旧的那个(因此查找只能看到最近的一个)。如果我看到超过 1 个,这意味着我们要保留的 2 个文件(匹配模式)比“$i”更新,所以我们可以删除“$i”

我相信有人会提出更好的建议,但我想这个想法可以重复使用...

如果您想要一个与您的解决方案类似(但有效)的解决方案,请试试这个:

ls abc*.log | sort | head -n-2 | xargs rm

ls abc*.log:列出所有文件,匹配模式abc*.log
sort:将此列表按字典顺序(按名称)从最旧的日志文件排序到最新的日志文件
head -n-2:return 除了列表中的最后两个条目之外的所有条目(您也可以给 -n 一个负计数)
xargs rm:使用标准输入

中的条目组成 rm 命令

如果目录中有两个或更少的文件,此命令将return 一个类似

的错误
rm: missing operand

并且不会删除任何文件。

感谢 guyz 的所有回答。 我找到了答案

files=`ls -t *.txt | head -n 2 | tr '\n' '|' | rev |cut -c 2- |rev`
rm `ls -t | egrep -v "$files"`

感谢您的帮助