Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在shell脚本中使用函数时如何记录压缩的zip文件_Linux_Bash_Shell - Fatal编程技术网

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

Linux 在shell脚本中使用函数时如何记录压缩的zip文件,linux,bash,shell,Linux,Bash,Shell,我正在编写一个shell脚本,该脚本应该验证linux中多个文件夹中的.gz文件,然后在某个特定文件未压缩时对其进行gzip,如果该文件已经压缩,则使用以下条件清除它们。 a) 文件夹中的所有这些文件的扩展名都是*.log..gz 所以我使用函数和find cmd来实现相同的功能 脚本似乎工作正常,但它并没有将压缩文件信息记录到日志文件中,而是对要记录的文件夹中已经压缩的文件进行假脱机。这是使用函数的正确方法吗 #!/bin/bash DIR_PATH="/var/log" LOG="/tmp/

我正在编写一个shell脚本,该脚本应该验证linux中多个文件夹中的.gz文件,然后在某个特定文件未压缩时对其进行gzip,如果该文件已经压缩,则使用以下条件清除它们。 a) 文件夹中的所有这些文件的扩展名都是*.log..gz

所以我使用函数和find 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.

您的代码非常混乱。例如:

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”
    传递给函数,然后再次尝试查找文件
  • 在fun_purge_log()中,您忽略了传入的参数,然后使用全局变量
    i
    作为目录参数来查找
    find
    ,并循环查看
    find
    输出的文件列表-为什么不选择一个新变量名并使用一些局部变量
  • 我无法想象你认为
    2>/dev/null
    \(-name“*log.20*”2>/dev/null\)
    中会做什么
  • 您试图将某些内容附加到
    $LOG
    中,但没有打印任何附加内容

  • 通过shellcheck(例如,在shellcheck.net上)运行您的代码,阅读,然后真正思考代码的每一行都在做什么。请自行更正问题,然后如果您仍然有问题,请告知我们。哦,按照惯例,为了避免与其他变量发生冲突,不要将所有大写字母用于未导出的变量名,最后使用
    $(command)
    而不是
    `command`
    ,您的代码非常混乱。例如:

    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”
    传递给函数,然后再次尝试查找文件
  • 在fun_purge_log()中,您忽略了传入的参数,然后使用全局变量
    i
    作为目录参数来查找
    find
    ,并循环查看
    find
    输出的文件列表-为什么不选择一个新变量名并使用一些局部变量
  • 我无法想象你认为
    2>/dev/null
    \(-name“*log.20*”2>/dev/null\)
    中会做什么
  • 您试图将某些内容附加到
    $LOG
    中,但没有打印任何附加内容

  • 通过shellcheck(例如,在shellcheck.net上)运行您的代码,阅读,然后真正思考代码的每一行都在做什么。请自行更正问题,然后如果您仍然有问题,请告知我们。哦,按照惯例,为了避免与其他变量发生冲突,不要将所有大写字母用于未导出的变量名,最后使用
    $(command)
    而不是
    `command`

    请将LOG=/tmp/test.LOG修改为LOG=“/tmp/test.LOG”。嗨,Manoj,我只是这样做了,但仍然没有将压缩文件信息假脱机记录到日志中。顺便说一句,谢谢你的回答。@ManojRana那没有任何区别。你的脚本在这里运行得很好。我不会用ls(1)来计算文件数,至少让它成为
    /bin/ls
    。请参见将LOG=/tmp/test.LOG修改为LOG=“/tmp/test.LOG”。您好,我只是这么做了,但它仍然不会将压缩文件信息假脱机到日志中。顺便说一句,谢谢你的回答。@ManojRana那没有任何区别。你的脚本在这里运行得很好。我不会用ls(1)来计算文件数,至少要让它成为
    /bin/ls
    。请看Hi-Ed,谢谢你的建议。1.fun_zip_日志中的变量“i”意味着迭代要运行在所有需要基于find cmd进行gzip压缩的文件上,但我会更改该变量。2.我不清楚如何使用函数实现这种逻辑,我的意思是验证多个文件夹中的gz文件,并在函数上运行它们,以根据条件查找文件。3.我使用2>/dev/null忽略std输出错误,因为当find cmd中的条件不匹配时,脚本没有抛出此类文件或目录错误。你能为实现这一目标提供一些帮助吗。好。2.你的问题与使用函数无关,内联编写代码,它会有完全相同的问题。3.在
    \(-name“*log.20*”2>/dev/null\)
    find
    中不会生成关于找不到的文件的错误消息,只是找不到。请按照我在回答结束时的建议去做,然后在你需要提问的时候发布你的更正脚本。嗨,Ed,我已经对我的代码做了一些修改,下面是一些需要进一步了解的要点。1。当我不会将stderr重定向到2>/dev/null 2时,find cmd会抛出“没有这样的文件或目录”。在验证文件格式状态并将其打印到日志(例如:如果找到zip文件,则应清除并将其打印到日志,如果找到日志,则应将其压缩,然后将其打印到日志)时打印到forloop的每个值的任何更新,对如何实现这一点有何建议?输出查找:`/var/log/kevin/log.20*':没有这样的文件或目录更改代码:fun\u zip\u log(){find“$i”-type f(-name.log.20”)!-iname“*.gz”-exec gzip'{}\>>$log\u file}想一想-当搜索文件和目录时,
    如何查找
    报告
    没有这样的文件或目录
    ?这就像你在停车场数车时,偶尔大喊一声“这辆车不存在”。这毫无意义。除非传递到
    find
    的根目录不存在,即
    find“$i”…
    中的
    “$i”
    ,如果发生这种情况,您肯定不想通过