1

У меня есть несколько очень больших файлов журналов, которые я хочу сжать по отдельности, поэтому я не могу использовать xargs или pipe stdout, чтобы получить огромный сжатый файл.

Я пытаюсь сделать это:

find . -mtime +1 -iname "*.log" -exec tar -jcvf {} --remove-files \; 

Но я получаю:

tar: Cowardly refusing to create an empty archive
Try `tar --help' or `tar --usage' for more information.

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

И да, find действительно находит файл:

find . -mtime +1 -iname "*.log" 
./20141002.tcp.log                  # just a test file...

Может кто-нибудь сказать мне, что я делаю не так?

Спасибо!

2 ответа2

1

Tar жалуется , потому что вы пропустите передать аргумент его опции -f не из-за -- что ты заподозрить.

Вот один из способов исправить вашу команду, которая работает с GNU tar что, вероятно, то, что вы используете:

find . -mtime +1 -iname "*.log" -exec tar --remove-files -jcvf {}.tar.bz2 {} \; 

Если ваша реализация find хочет {} остаться в одиночестве, как указано в стандарте POSIX, вы можете запустить:

find . -mtime +1 -iname "*.log" -exec sh -c 'tar --remove-files -jcvf $1.tar.bz2 $1' sh {} \; 
1

Я собираюсь ответить на свой вопрос только для полноты картины.

Поскольку я не мог удалить исходные файлы, так как они сжимались, я просто сделал крошечный скрипт, чтобы удалить их вручную. Не фантазия, а жизнь в cron творит чудеса: моя занятость выросла с 60% до 10%.

здесь сценарий

#!/bin/bash
find /var/log/remote -mtime +1 -iname "*.log" > /tmp/tmp_file
for i in $(cat /tmp/tmp_file) ; do tar jcvf $i.bz2 $i && rm -rf $i ; done 
rm -rf /tmp/tmp_file

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .