Как записать сжатые zip-файлы при использовании функции в скрипте оболочки - PullRequest
0 голосов
/ 04 мая 2019

Я работаю над сценарием оболочки, который должен проверять файлы .gz в нескольких папках в linux, а затем 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 Ответ

2 голосов
/ 04 мая 2019

Ваш код очень запутанный и запутанный.Например, в этом:

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, а также для циклического просмотра списка файлов, выводимых find - почему бы не выбрать новое имя переменной и использовать некоторые локальные переменные?
  3. Я не могу представить, что, по вашему мнению, 2>/dev/null собирается сделать в \( -name "*log.20*" 2>/dev/null \).
  4. You 'Вы пытаетесь добавить что-то к $LOG, но вы ничего не печатаете, чтобы добавить к нему.

Запустите ваш код через shellcheck (например, на shellcheck.net), прочитайте http://mywiki.wooledge.org/BashFAQ/001,https://mywiki.wooledge.org/Quotes и https://mywiki.wooledge.org/ParsingLs, и действительно просто ДУМАЙТЕ о том, что делает каждая строка вашего кода.Исправьте проблемы самостоятельно, а затем дайте нам знать, если у вас все еще есть проблема.Да, и по соглашению, чтобы избежать столкновения с другими переменными, не используйте все заглавные буквы для неэкспортированных имен переменных и, наконец, используйте $(command) вместо `command`.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...