2010-01-17 11:25:07 +0000 2010-01-17 11:25:07 +0000
32
32

¿Cómo alquitranar el directorio y luego eliminar los originales incluyendo el directorio?

Estoy tratando de tar una colección de archivos en un directorio llamado ‘mi_directorio’ y eliminar los originales usando el comando:

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

Sin embargo, sólo elimina los archivos individuales dentro del directorio y no el directorio en sí (que es lo que especifiqué en el comando). ¿Qué me falta aquí?

EDIT:

Sí, supongo que la opción ‘remove-files’ es bastante literal. Aunque yo también encontré la página man poco clara en ese punto. (En linux tiendo a no distinguir mucho entre directorios y archivos, y me olvido a veces de que no son la misma cosa). Parece que el consenso es que no elimina directorios.

Sin embargo, mi mayor motivo para hacer esta pregunta proviene del manejo de tar de las rutas absolutas. Debido a que debe especificar una ruta relativa a un archivo/s para ser comprimido, por lo tanto debe cambiar al directorio padre para tararlo correctamente. Tal y como yo lo veo, utilizar cualquier tipo de comando ‘rm’ posterior es potencialmente peligroso en esa situación. Por lo tanto, esperaba simplificar las cosas haciendo que el propio tar hiciera la eliminación.

Por ejemplo, imagina un script de copia de seguridad en el que el directorio a respaldar (es decir, tar) se incluye como una variable de shell. Si el valor de esa variable del shell se introduce mal, es posible que el resultado sea la eliminación de los archivos del último directorio en el que se encuentre.

Respuestas (5)

19
19
19
2010-01-17 11:58:18 +0000

Dado que la opción --remove-files sólo elimina archivos, podría probar con

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

para que el directorio se elimine sólo si el tar devuelve un estado de salida de 0

12
12
12
2010-01-17 11:42:11 +0000

Te falta la parte que dice que la opción --remove-files elimina ficheros después de añadirlos al archivo.

Podría seguir la operación de archivado y eliminación de ficheros con un comando como,

find /ruta/que/se/archiva/ -profundidad -tipo d -vacío -exec rmdir {} \;

  • *

Actualización: Puede que le interese leer esta breve discusión en Debian sobre, Bug 424692: –remove-files se queja de que los directorios “cambiaron al leerlo” .

7
7
7
2014-11-12 10:15:09 +0000

¿Has probado a poner la directiva –remove-files después del nombre del archivo? A mí me funciona.

tar -cvf files.tar --remove-files my_directory
1
1
1
2010-10-04 19:58:41 +0000
source={directory argument}

por ejemplo,

source={FULL ABSOLUTE PATH}/my_directory

 

parent={parent directory of argument}

por ejemplo,

parent={ABSOLUTE PATH of 'my_directory'/

 

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

Entonces podría ejecutar algo parecido a

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
1
1
1
2011-11-14 13:21:38 +0000

Probablemente se trate de un error.

También la palabra “archivo” es ambigua en este caso. Pero debido a que este es un interruptor de línea de comandos yo esperaría que significara también directorios, porque en unix/lnux todo es un archivo, también un directorio. (La otra interpretación es por supuesto también válida, pero no tiene sentido mantener los directorios en tal caso. Lo 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. Otro indicio de que el mantenimiento del árbol era un error. O al menos alguna solución hasta que lo arreglaran.

Esto es lo que he probado en una consola de ubuntu 10.04:

mit:/var/tmp$ mkdir tree1 mit:/var/tmp$ mkdir tree1/sub1 mit:/var/tmp$ \> tree1/sub1/file1 mit:/var/tmp$ ls -la drwxrwxrwt 4 root root 4096 2011-11-14 15:40 . drwxr-xr-x 16 root root 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 # AS YOU CAN SEE THE TREE IS GONE NOW: mit:/var/tmp$ ls -la drwxrwxrwt 3 root root 4096 2011-11-14 15:41 . drwxr-xr-x 16 root root 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 tar (GNU tar) 1.22 Copyright © 2009 Free Software Foundation, Inc.

Si quieres verlo en tu máquina, pega esto en una consola bajo tu propio riesgo:

tar --version cd /var/tmp mkdir -p tree1/sub1 \> tree1/sub1/file1 tar -czf tree1.tar.gz tree1/ --remove-files ls -la