2012-02-13 2 views
1

Мой сценарий в настоящее время выглядит следующим образом:Как я могу безопасно gzip и удалить файл, если я хочу добавить к существующему .gz-файлу, если он существует?

find Logs/ -type f -name \*.log -exec gzip -q -9 {} \; 

Прямо сейчас это не удается, если myLog.log.gz уже существует. Вместо этого я хочу добавить в myLog.log.gz. На странице руководства gzip вы можете сделать это примерно с gzip -c myLog.log >> myLog.log.gz. Но это не удаляет myLog.log, когда он делает gzipping.

Как я могу безопасно gzip и удалить файл, добавив к существующему .gz, если необходимо?

+0

Это не должно, поскольку вы соглашаетесь на '* .log' - он не должен совпадать с' * .log.gz'. Для этого потребуется '* .log *'. –

+2

Это не должно терпеть неудачу? Это терпит неудачу, если у меня есть как myLog.log, так и myLog.log.gz в том же каталоге, потому что gzip не хочет перезаписывать myLog.log.gz –

+0

да, но обратите внимание, что примером на странице 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

ответ

1

Во-первых, в зависимости от того, что вы хотите сделать (например, только для целей архивирования), может быть более подходящим только 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 ГБ каждый или что-то в этом роде), но для большинства обычных приложений он должен выполнять эту работу.

Надеюсь, это поможет.

 Смежные вопросы

  • Нет связанных вопросов^_^