使用脚本编译文件时,会产生一些编译的log或txt文件,在重新编译时会导致无法进行第二次编译,故在写编译脚本时,需要在编译前进行编译log文件的清除操作。
一般使用如下操作:
if [ -e *.log ]; then
rm *.log
fi
此时如果文件不存在,则不报错误。但如果有多个.log文件存在,则报错。这显然不满足要求的。在上述if[ -e *.log ]操作中,因为-e 或者 -f 都只能接受一个参数,用了通配符后会有多个文件存在的可能就导致多个参数出现的可能,所以报错。
采用以下操作就会解决产生多个*.log清除时报错的问题。
files=$(ls *.log 2> /dev/null | wc -l)
if [ "$files" != "0" ] ;then
rm *.log
fi
对于以上的操作解释:
ls *.log 查找所有的log文件;
2> 表示重定向操作错误提示信息(只有这两个字符并不能删除错误输出);
-
0 —— stdin(标准输入)
-
1 —— stdout (标准输出)
-
2 —— stderr (标准错误)
重定向操作符号有两个>和>>。尽管这两个操作符都可以将重定向到文件,但是前者会先清空文件,再写入内容;后者会将内容追加到现有文件的尾部。
/dev/null 是一个特殊的设备文件,这个文件接收到的任何数据都会被丢弃。因此,null这个设备通常也被成为位桶(bit bucket)或黑洞。
(借用网络图)
wc 指令我们可以计算文件的Byte数、字数、或是列数,若不指定文件名称、或是所给予的文件名为"-",则wc指令会从标准输入设备读取数据。
参数:
-c或--bytes或--chars 只显示Bytes数。
-l或--lines 只显示行数。
-w或--words 只显示字数。
--help 在线帮助。
--version 显示版本信息
命令:file=$(ls *.log 2> /dev/null | wc -l)
ls命令如果出现了错误提示,就会被重定向到/dev/null垃圾桶去了。所以,屏幕上不会打印任何输出关于错误的提示字符。在这个命令的操作中,file 获得文件stdout标准输出,也就是文件述符1的屏幕输出结果"*.log"。如果,这个123.txt文件不存在,file就肯定什么都拿不到,因为错误提示被/dev/null 吃了(划掉),被重定向丢弃了屏幕也不显示错误提示。所以,file 就是个什么都没有的空变量。
通过上述的操作,就可以删除编译产生的多个*.log文件。