сценарий оболочки для копирования файлов журнала в один сжатый файл - PullRequest
0 голосов
/ 26 апреля 2018

У нас есть папка на нашей встроенной плате «statuslogs», эта папка содержит журналы в формате: daily_status_date_time.log.

Нам нужно собрать все файлы определенного года в один файл, для выборки с сервера.

Мы сделали следующее в нашем скрипте

gzip -c statuslogs/daily_status_2017*.log > status_2017.gz
gzip -c statuslogs/daily_status_2018*.log > status_2018.gz
gzip -c statuslogs/daily_status_2019*.log > status_2019.gz
gzip -c statuslogs/daily_status_2020*.log > status_2020.gz
gzip -c statuslogs/daily_status_2021*.log > status_2021.gz

Проблема с этой логикой заключается в том, что она по-прежнему будет создавать файл состояния _ *. gz для 2019 года,2020,2021.

Я попытался написать следующую логику

if [ - f statuslogs/daily_status_2017*.log ], но это не удалось из-за регулярного выражения.И я не использую bash, переводчик - пепел.

Не могли бы вы помочь мне оптимизировать сценарий

Спасибо за ваше время

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

У вас есть синтаксическая ошибка.Это -f, а не - f.Пример:

if [ -f statuslogs/daily_status_2017*.log ]; then
    gzip -c statuslogs/daily_status_2017*.log > status_2017.gz
fi

Однако при этом вы, вероятно, столкнетесь с ошибкой «слишком много аргументов», которая произойдет, если у вас более одного соответствующего файла.Так что это будет работать лучше:

if find statuslogs/daily_status_2017*.log -mindepth 0 -maxdepth 0|head -n1; then 
    gzip -c statuslogs/daily_status_2017*.log > status_2017.gz
fi

Было бы лучше вместо этого остановить цикл, когда вы достигнете текущего года.Например,

for year in $(seq 2017 $(date +%Y)); do
0 голосов
/ 26 апреля 2018

Gzip работает только для отдельных файлов.Если вам нужны отдельные файлы, вам нужно выполнить одно из следующих действий:

Объединить файлы, используя tar:

tar cf status_2017.tar.gz statuslogs/daily_status_2017*.log

ИЛИ использовать zip, который поддерживает несколько файлов напрямую

zip status_2017.zip statuslogs/daily_status_2017*.log

Теперь, если проблема в том, что вам нужен один архив на каждый год, но только на те годы, для которых существуют файлы, вы можете обрабатывать все годы, используя цикл for:

for year in `ls statuslogs/daily_status_* | cut -d _ -f 3 | sort | uniq`; do 
    tar cf status_$year.tar.gz statuslogs/daily_status_$year*.log; 
done

Если ваша оболочка не поддерживает этот формат вызова, вы можете попробовать это вместо этого

ls statuslogs/daily_status_* | cut -d _ -f 3 | sort | uniq > years
cat years | while read year; do
    tar cf status_$year.tar.gz statuslogs/daily_status_$year*.log; 
done

Если вам нужен только один файл для всех журналов, вы можете просто полностью забыть о годовой части

tar cf statuslogs.tar.gz statuslogs/daily_status*.log
...