Как я могу безопасно gzip и удалить файл, если я хочу добавить к существующему файлу .gz, если он существует? - PullRequest
1 голос
/ 14 февраля 2012

Мой скрипт сейчас выглядит так:

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 при необходимости?

1 Ответ

1 голос
/ 14 февраля 2012

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

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

...