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"`
感谢您的帮助
我想删除除当前日志和之前日志之外的所有日志。 这些日志文件是在 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"`
感谢您的帮助