我通常只是将它作为一个cron作业或脚本安排,但是,我想删除一个日志文件(它经常在每次脚本运行时附加),仅在50次之后。
脚本内部需要:
问题是,由于脚本不能一致地运行,因此必须在脚本本身内实现。 请注意:出于各种原因,我需要在脚本中使用它。
我在尝试什么:
我正在考虑将变量设置为递增,将其输出到文件,然后让脚本每次都读取该文件。然后,如果该值大于X,则删除该文件。该部分代码将是grep
或awk
语句。
任何人都知道一个简单,更好的方法吗?您的积极意见得到高度赞赏。
答案 0 :(得分:2)
您可以使用xattr
将任意元数据与文件相关联,如下所示:
touch a.txt # Create file
xattr -w runs 1 a.txt # Set run count to 1
xattr -p runs a.txt # Print run count
1
xattr -w runs 49 a.txt # Change value
xattr -l a.txt # List all attributes
runs: 49
它的美妙之处在于它不会出现在grep
中或者使用普通工具查看文件时。
请注意,并非所有文件系统(例如Microsoft FAT)都支持xattr
。
答案 1 :(得分:2)
自Gnu awk v.4.1以来,就地编辑已经可用 (参见awk save modifications in place)所以,您可以将计数器存储到您的awk脚本变量中,并使用awk脚本编辑自身并减少计数器变量,如下所示:
$ cat program.awk
BEGIN {
this=5 # the counter variable
}
/this=[0-9]+/ { # if counter (this=5) matches
if(this==0) # if counter is down to 0...
; # ... do what you need to do
split($0,a,"=") # split "this=5" by the "="
sub(/=[0-9]+$/,"=" (a[2]==0?5:a[2]-1)) # decrement it or if 0 set to 5 again
}
1 # print
运行它:
$ awk -i inplace -f program.awk program.awk
$ head -3 program.awk
BEGIN {
this=4 # the counter variable
}
基本上你运行program.awk
会更改program.awk
内的一条记录,一旦计数器达到0,if
就会被执行。
答案 2 :(得分:1)
在下面的代码中使用sed
,每次时,脚本中的x
都会增加1
>脚本运行,最多50
,然后将x
设置回1
。您可以设置命令以处理else
语句的if
分支中的日志文件以及其他代码你想在每个分支中运行。
#!/bin/bash
x=1
y=$((x+1))
z=1
if [ $x -lt 50 ]; then
# Do something...
sed -i -e "s/x=$x/x=$y/" "$0"
else
# Do something...
# Delete logfile...
sed -i -e "s/x=$x/x=$z/" "$0"
fi
在这里,我运行脚本以显示x
增加并在50次运行后重置为1
:
$ cat testscript
#!/bin/bash
x=1
y=$((x+1))
z=1
if [ $x -lt 50 ]; then
# Do something...
sed -i -e "s/x=$x/x=$y/" "$0"
else
# Do something...
# Delete logfile...
sed -i -e "s/x=$x/x=$z/" "$0"
fi
$ ./testscript
$ cat testscript
#!/bin/bash
x=2
y=$((x+1))
z=1
if [ $x -lt 50 ]; then
# Do something...
sed -i -e "s/x=$x/x=$y/" "$0"
else
# Do something...
# Delete logfile...
sed -i -e "s/x=$x/x=$z/" "$0"
fi
$
正如您所看到的,x=1
已成为脚本中的x=2
。
我现在手动将x=2
设置为x=50
并保存脚本以显示其重置为x=1
。
$ cat testscript
#!/bin/bash
x=50
y=$((x+1))
z=1
if [ $x -lt 50 ]; then
# Do something...
sed -i -e "s/x=$x/x=$y/" "$0"
else
# Do something...
# Delete logfile...
sed -i -e "s/x=$x/x=$z/" "$0"
fi
$ ./testscript
$ cat testscript
#!/bin/bash
x=1
y=$((x+1))
z=1
if [ $x -lt 50 ]; then
# Do something...
sed -i -e "s/x=$x/x=$y/" "$0"
else
# Do something...
# Delete logfile...
sed -i -e "s/x=$x/x=$z/" "$0"
fi
$
答案 3 :(得分:0)
如上所述,我的主要要求是在脚本内进行或内联。正如@EvansWinner所提到的,我可以使用文件大小或年龄等属性来管理文件。但是,我使用的行数更加简单。
SetByteArrayRegion(env, byteArray, from, size, a + from);
因此,我不必担心它运行了多少次。希望对于那些试图在脚本中每隔x次删除一个文件的人来说,这将有助于您查看文件属性以及如何使用大小,年龄或我使用的行数管理它们。这些解决方案比创建其他系统所需的程序或包更加便携。