jak korzystać z opcji tar '--remove-files' wewnątrz find -exec?

1

Mam wiele bardzo dużych plików dziennika, które chcę indywidualnie skompresować, więc nie mogę użyć xargs ani potoku standardowego, aby uzyskać ogromny skompresowany plik.

Próbuję to zrobić:

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

Ale dostaję:

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

Próbowałem uciec przed podwójnym myślnikiem (-), który moim zdaniem jest problemem, ale bezskutecznie.

I tak, find faktycznie znajduje plik:

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

Czy ktoś mógłby mi powiedzieć, co robię źle?

Dzięki!

Makimoto Marakatti
źródło

Odpowiedzi:

1

Tarnarzeka, ponieważ brakuje Ci argumentu do jego -fopcji, a nie z powodu tego, --co podejrzewasz.

Oto jeden ze sposobów, aby naprawić polecenie, które działa, z GNU tarktórym prawdopodobnie korzystasz:

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

Jeśli Twoja findimplementacja chce {}pozostać sama, jak określa standard POSIX, możesz uruchomić:

find . -mtime +1 -iname "*.log" -exec sh -c 'tar --remove-files -jcvf $1.tar.bz2 $1' sh {} \; 
jlliagre
źródło
1

Odpowiem na własne pytanie tylko ze względu na kompletność.

Ponieważ nie mogłem usunąć plików źródłowych podczas ich kompresji, stworzyłem skrypt wee, aby ręcznie je zeskrobać. Nic dziwnego, ale życie w cronie czyni cuda: moje obłożenie vol wzrosło z 60% do 10%.

tutaj skrypt

#!/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
Makimoto Marakatti
źródło