Во-первых, в зависимости от того, что вы хотите сделать (например, только для целей архивирования), может быть более подходящим только tar
два файла или что-то в этом роде. Однако ниже вы объясняете свои требования.
Я действительно надеюсь :) есть более краткий способ сделать это, но не хватает, что один этот will do the job:
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 ГБ каждый или что-то в этом роде), но для большинства обычных приложений он должен выполнять эту работу.
Надеюсь, это поможет.
Это не должно, поскольку вы соглашаетесь на '* .log' - он не должен совпадать с' * .log.gz'. Для этого потребуется '* .log *'. –
Это не должно терпеть неудачу? Это терпит неудачу, если у меня есть как myLog.log, так и myLog.log.gz в том же каталоге, потому что gzip не хочет перезаписывать myLog.log.gz –
да, но обратите внимание, что примером на странице man является 'gzip -c file1> foo .gz; gzip -c file2 >> foo.gz'. Конкатенация имен файлов отличается от файла gz. То, что у вас есть, испортит ваш существующий myLog.log.gz, ИЛИ, по крайней мере, приведет к тому, что много многократных данных будет храниться в .gz-файле, то есть 'ver1log >> log.gz; ver2log >> log.gz ver3log >> log.gz' Удачи. – shellter