Во-первых, в зависимости от того, что вы хотите сделать (например, просто для целей архивирования), может быть более подходящим просто tar
два файла или что-то в этом роде.Тем не менее, ниже, как вы объяснили свои требования.
Я действительно надеюсь :) есть более краткий способ сделать это, но не хватает этого, этот сделает работу :
find logs -type f -name \*.log -exec sh -c '
if [ -f "{}.gz" ]; then
tmpf=`mktemp tmpXXX`
mv "{}" $tmpf
gunzip "{}"
cat $tmpf >> "{}"
gzip "{}"
rm $tmpf
else
gzip {}
fi
' \;
Вот небольшой тестовый скрипт - поместите вышеупомянутый в gzip-combine.sh
, ниже в test-gzip-combine.sh
и запустите его во временную папку (как вы можете видеть, он удаляет logs
в этой папке, так что нене запускайте его где-нибудь, где у вас есть журналы:))):
# Make sample logs
rm -rf logs
mkdir logs
echo "hello" > logs/a.log
gzip logs/a.log
echo "world" > logs/a.log
echo "miss" > logs/b.log
echo "think" > logs/c.log
# Run
./gzip-combine.sh
# Test
for i in logs/*; do
echo ---- $i
gzip -l $i
gunzip -c $i
done
Вывод будет выглядеть примерно так:
$ ./test-gzip-combine.sh
---- logs/a.log.gz
compressed uncompressed ratio uncompressed_name
38 12 50.0% logs/a.log
hello
world
---- logs/b.log.gz
compressed uncompressed ratio uncompressed_name
31 5 120.0% logs/b.log
miss
---- logs/c.log.gz
compressed uncompressed ratio uncompressed_name
32 6 100.0% logs/c.log
think
Таким образом, вы можете увидеть это вместе a.log
, имеяworld
в нем и a.log.gz
, результат gzip logs/a.log
выше, с hello
в нем.
Очевидно, что по многим причинам не защищен от ошибок (например, если у вас заканчивается свободное место на диске, запуститеиз-за электричества или журналов по 1 ГБ каждый или что-то в этом роде), но для большинства обычных приложений это должно сработать.
Надеюсь, это поможет.