在Shell脚本中使用函数时如何记录压缩的zip文件

时间:2019-05-04 11:19:19

标签: linux bash shell

我正在研究一个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.

1 个答案:

答案 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"
  1. 在调用代码中,您正在循环设置变量file,但随后将目录"$i"传递给函数,然后尝试再次查找文件。
  2. 在fun_purge_log()中,您将忽略传入的参数,然后将全局变量i用作find的目录参数,并循环浏览{ {1}}-为什么不选择一个新的变量名并使用一些局部变量?
  3. 我无法想象您在find中会想到2>/dev/null会做什么。
  4. 您正在尝试将某些内容附加到\( -name "*log.20*" 2>/dev/null \),但没有打印任何内容来附加到其上。

通过shellcheck(例如,在shellcheck.net)运行代码,阅读http://mywiki.wooledge.org/BashFAQ/001https://mywiki.wooledge.org/Quoteshttps://mywiki.wooledge.org/ParsingLs,实际上只是想一想代码的每一行在做什么。自己解决问题,然后让我们知道您是否还有问题。哦,按照惯例,为避免与其他变量发生冲突,请不要对未导出的变量名使用全部大写字母,最后请使用$LOG而不是$(command)