Tengo esta línea muy simple en un script bash que se ejecuta con éxito (es decir, produce el _data.tar
archivo), excepto que no excluye los subdirectorios que se le dice excluir mediante la --exclude
opción:
/bin/tar -cf /home/_data.tar --exclude='/data/sub1/*' --exclude='/data/sub2/*' --exclude='/data/sub3/*' --exclude='/data/sub4/*' --exclude='/data/sub5/*' /data
En su lugar, produce un _data.tar
archivo que contiene todo lo que se encuentra debajo de / data, incluidos los archivos en los subdirectorios que quería excluir.
¿Alguna idea de por qué? y como arreglar esto?
Actualización Implementé mis observaciones basadas en el enlace provisto en la primera respuesta a continuación (dir de nivel superior primero, sin espacios en blanco después de la última exclusión):
/bin/tar -cf /home/_data.tar /data --exclude='/data/sub1/*' --exclude='/data/sub2/*' --exclude='/data/sub3/*' --exclude='/data/sub4/*' --exclude='/data/sub5/*'
Pero eso no ayudó. Todos los subdirectorios "excluidos" están presentes en el _data.tar
archivo resultante .
Esto es desconcertante. Si esto es un error en el tar actual (GNU tar 1.23, en un CentOS 6.2, Linux 2.6.32) o "extrema sensibilidad" del tar a espacios en blanco y otros errores tipográficos fáciles de omitir, considero que esto es un error. Por ahora.
Esto es horrible : probé la información sugerida a continuación (sin seguimiento /*
) y todavía no funciona en el script de producción:
/bin/tar -cf /home/_data.tar /data --exclude='/data/sub1' --exclude='/data/sub2' --exclude='/data/sub3' --exclude='/data/sub4'
No puedo ver ninguna diferencia entre lo que probé y lo que intentó @Richard Perrin, excepto por las comillas y 2 espacios en lugar de 1. Voy a intentar esto (debo esperar a que el script nocturno se ejecute como el directorio que se respaldará) arriba es enorme) e informar de nuevo.
/bin/tar -cf /home/_data.tar /data --exclude=/data/sub1 --exclude=/data/sub2 --exclude=/data/sub3 --exclude=/data/sub4
Estoy empezando a pensar que todas estas tar --exclude
sensibilidades no son alquitranes sino algo en mi entorno, pero ¿qué podría ser eso?
¡Funcionó! La última variación probada (sin comillas simples y espacio simple en lugar de espacio doble entre las --exclude
s) probó el trabajo. Extraño pero aceptable.
¡Increíble! Resulta que una versión anterior de tar
(1.15.1) solo excluiría si el directorio de nivel superior es el último en la línea de comando. Esto es exactamente lo contrario de lo que requiere la versión 1.23. FYI.
--exclude b
(espacio en lugar de signo igual) vs--exclude=b
. ¿Esto hace alguna diferencia? (no debería en mi humilde opinión)--exclude=
en la misma línea. Entonces, la diferencia debe ser el idiota/*
que agregué a cada subdirectorio. Probaré esto esta noche en el guión de producción e informaré. Otro +1.Es posible que su versión de
tar
requiera que las--exclude
opciones tengan que colocarse al comienzo deltar
comando.Ver: https://stackoverflow.com/q/984204
Ver: http://mandrivausers.org/index.php?/topic/8585-multiple-exclude-in-tar/
Alternativa:
Otro
tar
consejo de comando es de aquí :fuente
--exclude=mydir/*
entonces no funciona (usandotar --exclude=maindir/mydir/* -cjf archive.tar2.bz2 maindir/*
).tar --version
); se supone que debian se enviará con muchas versiones diferentes de alquitrán a través de los años.--exclude
antes-czf
.Para excluir varios archivos, intente
Esto ahorrará algo de código y dolor de cabeza. Esta es una solución global, para todo tipo de programas / opciones. Si también desea incluir el directorio principal en su selección (en este caso, datos), debe incluir una coma final. P.ej:
fuente
mv /very/very/very/very/long/path/to/a/file{,.bak}
Este enlace puede ser útil. http://answers.google.com/answers/threadview/id/739467.html
Dos diferencias inmediatas entre la línea que no funciona y algunos consejos en el enlace:
--exclude
.fuente
-MAK
me llamó la atención y hasta ahora he podido detectar las siguientes diferencias entre mi línea que no funciona y las siguientes: 1. Todas las exclusiones vienen después del directorio de nivel superior. 2. No puede haber NINGÚN espacio después del último--exclude
. Probaré estas ideas e informaré de nuevo. +1 por ahora.Una solución alternativa puede ser utilizar una combinación de
find ... -prune
ytar
excluir los directorios especificados.En Mac OS X, la
--exclude
opción de GNUtar
parece funcionar como debería.En el siguiente caso de prueba, los directorios
/private/var/log/asl
y/private/var/log/DiagnosticMessages
se excluirán de un archivo comprimido del/private/var/log
directorio.fuente
Quizás pueda probar el comando con otra opción:
Y verifique si está funcionando según lo previsto.
fuente
Estoy usando una Mac, y descubrí que las exclusiones no funcionaban a menos que la carpeta de nivel superior sea el último argumento
ejemplo de comando de trabajo:
FYI:
fuente
En mi caso, no excluyó por una razón diferente.
La ruta completa frente a la ruta relativa.
Tanto el excluir como el directorio deben usar el mismo formato de ruta (es decir, la ruta completa o ambas rutas relativas)
Ejemplo:
Esto no funcionará porque excluir usa la ruta completa, mientras que el destino usa una ruta relativa
Esto funciona porque ambos usan la ruta completa
Esto funciona porque ambos usan la ruta relativa
fuente
En lugar de
--exclude=
usar-X
con un archivo de texto:http://www.cyberciti.biz/faq/exclude-certain-files-when-creating-a-tarball-using-tar-command/
fuente
Notas adicionales a la excelente respuesta de R Perrin :
Suponga que no desea archivar rutas absolutas sino relativas, por ejemplo, 'datos' en lugar de '/ tmp / data'. Para excluir rutas absolutas, sus argumentos tar diferirán en función de la implementación de tar (gnu tar vs bsd tar) que utilice:
fuente
Recién detectado en tar (GNU tar) 1.29
Esta llamada no excluye de los archivos de almacenamiento especificados con --exclude-from:
Esta llamada funciona correctamente:
¡El orden de los parámetros es importante!
fuente
Intenté todo tipo de combinaciones, incluidas algunas de las respuestas enumeradas, pero no pude excluir los archivos enumerados.
Así que, harto de perseguir la respuesta a lo que debía ser un trabajo de cinco minutos, hice lo contrario: creé un archivo de las carpetas que quería incluir.
Hice esto creando un archivo y luego agregándole :
Algunas notas
tar
(y no comprimido.tgz
/ tar.tar.gz
) puede comprimirlo más tarde usandogzip mybackup.tar
tar tvf mybackup.tar
.fuente