我正在研究一个Shell脚本,该脚本应验证linux中多个文件夹中的.gz文件,如果未压缩特定文件并且已经压缩该文件,则对它们进行gzip压缩,请按以下条件清除它们。 a)文件夹中所有这些文件的扩展名为* .log..gz
所以我当时使用函数并找到cmd来实现相同的目标。
脚本似乎运行良好,但是它没有将压缩文件信息记录到日志文件中,但是它假脱机了已压缩文件夹中的日志文件。这是使用函数的正确方法吗?
#!/bin/bash
DIR_PATH="/var/log"
LOG="/tmp/test.log"
VARLOG_PATH=("$DIR_PATH"{"Kevin","John","Robin","Pavan"})
fun_zip_log(){
for i in `find "$i" -type f \( -name "*.log.20*" 2>/dev/null \) `; do
gzip "$i" ; done >> $LOG
}
fun_purge_log(){
for i in `find "$i" -type f \( -name "log.20*" 2>/dev/null \) `; do rm -f
"$i" ; done >> $LOG
}
validate_zip(){
for file in $i/*.gz
do
if ! [ -f "$file" ];
then
echo "$file is getting zipped" >> $LOG
fun_zip_log "$i"
else
echo "$file is already zipped" >> $LOG
fun_purge_log "$i"
fi
done
}
#MainBlock
for i in "${VARLOG_PATH[@]}"
do
if [ -d "$i" ] && [ "$(ls -A "$i" |wc -l )" -gt 0 ]; then
echo "Searching for files in directory : "$i" " >> $LOG
validate_zip "$i"
else
echo "No files exist in directory : "$i" " >> $LOG
fi
done
exit
####LOG FILE###
Searching for files in directory : /var/log/Kevin
[*.gz] is getting zipped.
Searching for files in directory : /var/log/John
/var/log/John/instrumentation.log.2018-06-20.gz is already zipped
/var/log/John/instrumentation.log.2018-06-21.gz is already zipped
No files exist in directory : /var/log/Robin
Searching for files in directory : /var/log/Pavan
[*.gz] is getting zipped.
答案 0 :(得分:2)
您的代码非常混乱和混乱。例如:
fun_purge_log(){
for i in `find "$i" -type f \( -name "log.20*" 2>/dev/null \) `; do rm -f
"$i" ; done >> $LOG
}
for file in $i/*.gz
do
...
fun_purge_log "$i"
file
,但随后将目录"$i"
传递给函数,然后尝试再次查找文件。i
用作find
的目录参数,并循环浏览{ {1}}-为什么不选择一个新的变量名并使用一些局部变量?find
中会想到2>/dev/null
会做什么。\( -name "*log.20*" 2>/dev/null \)
,但没有打印任何内容来附加到其上。通过shellcheck(例如,在shellcheck.net)运行代码,阅读http://mywiki.wooledge.org/BashFAQ/001,https://mywiki.wooledge.org/Quotes和https://mywiki.wooledge.org/ParsingLs,实际上只是想一想代码的每一行在做什么。自己解决问题,然后让我们知道您是否还有问题。哦,按照惯例,为避免与其他变量发生冲突,请不要对未导出的变量名使用全部大写字母,最后请使用$LOG
而不是$(command)
。