Linux 在shell脚本中使用函数时如何记录压缩的zip文件
我正在编写一个shell脚本,该脚本应该验证linux中多个文件夹中的.gz文件,然后在某个特定文件未压缩时对其进行gzip,如果该文件已经压缩,则使用以下条件清除它们。 a) 文件夹中的所有这些文件的扩展名都是*.log..gz 所以我使用函数和find cmd来实现相同的功能 脚本似乎工作正常,但它并没有将压缩文件信息记录到日志文件中,而是对要记录的文件夹中已经压缩的文件进行假脱机。这是使用函数的正确方法吗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/
#!/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”
传递给函数,然后再次尝试查找文件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”
传递给函数,然后再次尝试查找文件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”
,如果发生这种情况,您肯定不想通过