tar: Cómo eliminar archivos después de empaquetar pero mantener el directorio

tar: Cómo eliminar archivos después de empaquetar pero mantener el directorio

Quiero que tar empaquete un directorio completo

tar cvjf dir.tbz dir

Pero haz que borre todos los archivos.

tar cvjf dir.tbz dir --remove-files

Sin embargo, esto también elimina ./dir. Así que intenté ingresar al directorio antes de empaquetar.

tar cvjf dir.tbz --remove-files -C dir .

Pero eso aún elimina ./dir... lo que no tiene ningún sentido para mí, porque ¿por qué tar debería eliminar el directorio de trabajo? ¿No puedo empaquetar un directorio completo y eliminar los archivos después de empaquetarlos sin borrar todo el directorio?

Tengo un proceso en ejecución que crea constantemente archivos en ./dir y quiero empaquetar todos los archivos cada hora y luego eliminar los que están empaquetados. Podría mkdir después de tar y eliminar, pero eso podría causar que el otro proceso que crea archivos tenga problemas cuando intenta escribir un nuevo archivo antes de que mkdir haya recreado el directorio.

Respuesta1

Podrías probar algo como esto:

find dir -type f -mmin +1 | xargs -I{} sh -c 'tar rvf dir.tar {} && rm {}'
bzip2 dir.tar && mv dir.tar.bz2 dir-$(date +%F-%T).tbz

Es un poco más complicado que su comando actual, pero funciona y no creo que tenga ningún problema de carrera (siempre que no se escriba un archivo varias veces con espacios de más de un minuto).

El findcomando encuentra todos los archivos dirque tienen al menos un minuto de antigüedad (por lo que no se están escribiendo actualmente). Luego, esta lista se canaliza a xargs, que agrega cada una de ellas al dir.tararchivo. Una vez que el archivo se ha agregado correctamente al archivo tar, se elimina el original. Hacerlo uno a la vez evita problemas de tener líneas de comando demasiado largas si tiene una gran cantidad de archivos. Finalmente puedes comprimir y cambiar el nombre del archivo tar.

Respuesta2

Mi solución a esto sería la siguiente ahora:

Escribo un script que ingresa al directorio y tarifica el material usando ./* y luego lo elimina. Solo esperaba que -C hiciera lo mismo para poder tenerlo en una línea de comando, pero no es así.

#!/bin/bash

cd /path/to/dir
tar cvjf dir.tbz ./* --remove-files

Deberia trabajar.

información relacionada