¿Cómo tar el directorio y luego eliminar los originales, incluido el directorio?

30

Estoy intentando taruna colección de archivos en un directorio llamado 'my_directory' y elimino los originales usando el comando:

tar -cvf files.tar my_directory --remove-files

Sin embargo, solo está eliminando los archivos individuales dentro del directorio y no el directorio en sí (que es lo que especifiqué en el comando). ¿Que me estoy perdiendo aqui?

EDITAR:

Sí, supongo que la opción 'eliminar archivos' es bastante literal. Aunque también encontré la página del manual poco clara sobre ese punto. (En Linux, tiendo a no distinguir mucho entre directorios y archivos, y a veces olvido que no son lo mismo). Parece que el consenso es que no elimina directorios.

Sin embargo, mi principal punto de inflexión para hacer esta pregunta proviene del manejo de tar de los caminos absolutos. Debido a que debe especificar una ruta relativa a un archivo / s que se comprimirá, por lo tanto, debe cambiar al directorio principal para tar correctamente. Como lo veo, usar cualquier tipo de comando 'rm' de seguimiento es potencialmente peligroso en esa situación. Por lo tanto, esperaba simplificar las cosas haciendo que el alquitrán mismo elimine.

Por ejemplo, imagine una secuencia de comandos de copia de seguridad donde el directorio para la copia de seguridad (es decir, tar) se incluye como una variable de shell. Si el valor de la variable de shell se ingresó incorrectamente, es posible que el resultado se elimine de los archivos del directorio en el que se encontraba por última vez.

Nicholas
fuente
Nicholas, su argumento de que agrega peligro tener que eliminar el árbol de directorios en un paso adicional es absolutamente válido. Creo que el archivero debería poder hacer esto de forma segura. También creo que esta fue la intención de los creadores de GNU tar, al menos debería haber sido ;-)
mit
2
Descubrí que la opción --remove-files elimina el directorio contenedor, al menos en algunas plataformas / en algunas versiones, y en mi caso. Es posible que en su caso el directorio restante no estuviera completamente vacío debido a que algunos archivos se modificaron después de ser tar'ed.
isync
@isync Parece que estoy experimentando --remove-files borrando directorios en Ubuntu 14.04. Excepto en mi caso, no quiero que lo haga. Jaja
Bradley Odell

Respuestas:

12

Te falta la parte que dice que la --remove-filesopción elimina archivos después de agregarlos al archivo.

Puede seguir la operación de archivo y eliminación de archivos con un comando como,

buscar / ruta / a / ser / archivado / -profundo -tipo d -empty -exec rmdir {} \;


Actualización: Puede que le interese leer esta breve discusión de Debian sobre el
error 424692: --remove-files se queja de que los directorios "cambiaron mientras lo leíamos" .

nik
fuente
¿Tal vez es en realidad: -ccambia el directorio antes de tarcomenzar su trabajo (y no regresa hasta que se hace)? Yo supongo que habría eliminado subdirectorios, si los que fueron incluidos en el archivo (pero no he probado eso).
Arjan
@Arajan, no creo que ' c'tenga nada que ver con esto; 'remove-files'intencionalmente no elimina directorios.
nik
Ajá, la explicación breve "eliminar archivos después de agregarlos al archivo" de las manpáginas no es muy clara, pero supongo que tienes razón. Aún así, no esperaría que el directorio mencionado -cse elimine incluso si tar también eliminé los directorios. (Para mí, eso sería como eliminar el directorio actual, por lo tanto, incluir el archivo en sí, cuando no se usa -c...?) Pero si -remove-filessiempre deja los directorios en su lugar, entonces seguramente solo estoy complicando las cosas aquí. ;-)
Arjan
3
--remove-filesSe corrigió el error tar-1.19.
x-yuri
19

Como la --remove-filesopción solo elimina archivos , puedes intentar

tar -cvf files.tar my_directory && rm -R my_directory

para que el directorio se elimine solo si tardevuelve un estado de salida de 0

pavium
fuente
99
¡excepto que debe verificar el estado de salida de tar antes de hacer el rm! de lo contrario, podría quedar sin archivo tar ni archivos ...
Kim
1
Cuando uso directorios de un nivel, creo que una opción más segura sería usar 'rmdir' en lugar de 'rm', ya que solo eliminaría un directorio vacío. [Ver ediciones de preguntas]
Nicholas
Pero rmdirsolo elimina directorios vacíos . La idea era eliminar el directorio y los archivos que contiene (siempre que tarsea ​​exitoso)
pavium
--remove-filesSe corrigió el error tar-1.19.
x-yuri
&& solo ejecutará el siguiente comando, si el comando anterior salió de 0 (correcto). Si sale> 0, el siguiente comando no se ejecutará. También puede revertir eso con || - solo se ejecuta si falla el primer comando. Una buena manera de hacer un terrible chequeo de contenido reinicia ese.
Kirrus
6

¿Has intentado poner la directiva --remove-files después del nombre del archivo? Esto funciona para mi.

tar -cvf files.tar --remove-files my_directory
Robert Grubba
fuente
1
Es más probable que el comportamiento del alquitrán haya cambiado desde que se planteó esta pregunta. Para mí, no hay diferencia en poner --remove-filesantes o después my_directory; en ambos casos, el directorio se elimina.
Redburn
55
--remove-filesSe corrigió el error tar-1.19.
x-yuri
1
source={directory argument}

p.ej

source={FULL ABSOLUTE PATH}/my_directory

 

parent={parent directory of argument}

p.ej

parent={ABSOLUTE PATH of 'my_directory'/

 

logFile={path to a run log that captures status messages}

Entonces podría ejecutar algo en la línea de:

cd ${parent}

tar cvf Tar_File.`date%Y%M%D_%H%M%S` ${source}

if [ $? != 0 ]

then

 echo "Backup FAILED for ${source} at `date` >> ${logFile}

else

 echo "Backup SUCCESS for ${source} at `date` >> ${logFile}

 rm -rf ${source}

fi
bombardeo
fuente
1

Esto probablemente fue un error.

También la palabra "archivo" es ambigua en este caso. Pero debido a que este es un cambio de línea de comando, esperaría que signifique también directorios, porque en unix / lnux todo es un archivo, también un directorio. (La otra interpretación, por supuesto, también es válida, pero no tiene sentido mantener directorios en ese caso. Consideraría un comportamiento inesperado y confuso).

Pero he encontrado que en gnu tar en algunas distribuciones gnu tar realmente elimina el árbol de directorios. Otra indicación de que mantener el árbol era un error. O al menos alguna solución hasta que lo arreglen.

Esto es lo que probé en una consola ubuntu 10.04:

mit: / var / tmp $ mkdir tree1                                                                                               
mit: / var / tmp $ mkdir árbol1 / sub1                                                                                          
mit: / var / tmp $> tree1 / sub1 / file1                                                                                        

mit: / var / tmp $ ls -la                                                                                                    
drwxrwxrwt 4 raíz 4096 2011-11-14 15:40.                                                                              
drwxr-xr-x 16 raíz 4096 2011-02-25 03:15 ..
drwxr-xr-x 3 mit mit 4096 2011-11-14 15:40 tree1

mit: / var / tmp $ tar -czf tree1.tar.gz tree1 / --remove-files

# COMO PUEDES VER EL ÁRBOL HA IDO AHORA:

mit: / var / tmp $ ls -la
drwxrwxrwt 3 raíz 4096 2011-11-14 15:41.
drwxr-xr-x 16 raíz 4096 2011-02-25 03:15 ..
-rw-r - r-- 1 mit mit 159 2011-11-14 15:41 tree1.tar.gz                                                                   


mit: / var / tmp $ tar --version                                                                                             
alquitrán (alquitrán GNU) 1.22                                                                                                           
Copyright © 2009 Free Software Foundation, Inc.

Si desea verlo en su máquina, péguelo en una consola bajo su propio riesgo:

tar --version                                                                                             
cd / var / tmp
mkdir -p tree1 / sub1                                                                                          
> árbol1 / sub1 / archivo1                                                                                        
tar -czf tree1.tar.gz tree1 / --remove-files
ls -la
mit
fuente