Добавьте последние n строк файлов в tar / zip - PullRequest
0 голосов
/ 05 февраля 2009

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

например:

/usr/local/data_store1/file.txt (500 lines)
/usr/local/data_store2/file.txt (800 lines)

Учитывая файл со списком необходимых файлов с именем files.txt, я хотел бы создать архив (tar или zip) с последними 100 строками каждого из этих файлов.

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

Я бы хотел, чтобы решением был сценарий оболочки, если это возможно, но Perl (без добавления модулей) также приемлем (это для машин Solaris, на которых не установлен ruby ​​/ python / и т.д ..)

Ответы [ 5 ]

1 голос
/ 19 мая 2009

Вы сосредотачиваетесь на конкретной реализации, а не смотрите на более широкую картину.

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

Для запуска rsync на целевой машине больше не нужно никаких демонов, кроме стандартной sshd, а для настройки автоматической передачи без паролей вам просто нужно использовать аутентификацию с открытым ключом.

1 голос
/ 05 февраля 2009

Вы можете попробовать

tail -n 10 your_file.txt | while read line; do zip /tmp/a.zip $line; done

, где a.zip - это zip-файл, а 10 - n или

.
tail -n 10 your_file.txt | xargs tar -czvf test.tar.gz --

для tar.gz

0 голосов
/ 05 февраля 2009

Использование logrotate .

Посмотрите примеры /etc/logrotate.d.

0 голосов
/ 05 февраля 2009

Для этого нет никакого волшебства, вам нужно будет создать нужную структуру папок и сжать ее.

mkdir tmp
for i in /usr/local/*/file.txt; do
    mkdir -p "`dirname tmp/${i:1}`"
    tail -n 100 "$i" > "tmp/${i:1}"
done
zip -r zipfile tmp/*
0 голосов
/ 05 февраля 2009

Почему бы не поместить файлы журналов в SCM?

Ваш получатель создает хранилище на своем компьютере, откуда он извлекает файлы, проверяя их.

Вы отправляете файлы, просто отправляя их. Только разница будет передана.

...