Intento tar.gz en un directorio y uso
tar -czf workspace.tar.gz *
El tar resultante incluye .svn
directorios en subdirectorios pero NO en el directorio actual (ya que *
se expande a solo archivos 'visibles' antes de pasar a tar
lo intenté
tar -czf workspace.tar.gz .
en su lugar, pero luego recibo un error porque '.' ha cambiado durante la lectura:
tar: ./workspace.tar.gz: file changed as we read it
¿Hay algún truco para que *
coincida con todos los archivos (incluidos los con prefijo de punto) en un directorio?
(usando bash en Linux SLES-11 (2.6.27.19)
linux
bash
design-patterns
tar
Micha
fuente
fuente
Respuestas:
No cree el archivo tar en el directorio que está empaquetando:
hace el truco, excepto que extraerá los archivos en todo el directorio actual cuando desempaquete. Mejor hacer:
cd .. tar -czf workspace.tar.gz workspace
o, si no conoce el nombre del directorio en el que se encontraba:
base=$(basename $PWD) cd .. tar -czf $base.tar.gz $base
(Esto supone que no siguió enlaces simbólicos para llegar a donde está y que el shell no intenta adivinarlo saltando hacia atrás a través de un enlace simbólico;
bash
no es confiable en este sentido. Si tiene que preocuparse por eso, usarcd -P ..
para hacer un directorio de cambios físicos. Es estúpido que no sea el comportamiento predeterminado en mi opinión, confuso, al menos, para aquellos para quienescd ..
nunca tuvo un significado alternativo).Un comentario en la discusión dice:
La primera parte del comentario no tiene mucho sentido: si el archivo tar contiene el directorio actual, no se creará cuando extraiga el archivo de ese archivo porque, por definición, el directorio actual ya existe (excepto en circunstancias muy extrañas ).
La segunda parte del comentario se puede tratar de dos formas:
/tmp
es una ubicación posible, y luego muévalo a la ubicación original una vez que esté completo.--exclude=workspace.tar.gz
opción. La cadena después de=
es un patrón, el ejemplo es el patrón más simple, una coincidencia exacta. Es posible que deba especificar--exclude=./workspace.tar.gz
si está trabajando en el directorio actual en contra de las recomendaciones; es posible que deba especificar--exclude=workspace/workspace.tar.gz
si está subiendo un nivel como se sugiere. Si tiene varios archivos tar para excluir, use '*
', como en--exclude=./*.gz
.fuente
Si realmente no desea incluir el directorio superior en el tarball (y eso generalmente es una mala idea):
fuente
Acdrtux
o uno de los nombres largos de función. Una letra de función no necesita tener el prefijo-
y puede combinarse con otras opciones de una sola letra.Hay un par de pasos a seguir:
*
por.
para incluir archivos ocultos también.--exclude=workspace.tar.gz
se puede utilizar un para excluir el archivo en sí.tar: .: file changed as we read it
error cuando el archivo aún no se ha creado, asegúrese de que exista (por ejemplo, usandotouch
), de modo que --exclude coincida con el nombre del archivo. (No coincide con el archivo no existe)Combinado, esto da como resultado el siguiente script:
fuente
--verbose
, de este modo:-czvf
.en el directorio desea comprimir (directorio actual) intente esto:
fuente
.gz
archivos del directorio.Puede incluir los directorios ocultos retrocediendo un directorio y haciendo:
cd .. tar czf workspace.tar.gz workspace
Suponiendo que el directorio que deseaba gzip se llamara espacio de trabajo.
fuente
tar -czf /path/to/where/you/do/have/permission/workspace.tar.gz workspace
-
antes delczf
para que funcionara. De lo contrario, recibí unCannot stat: No such file or directory
mensaje de error.Puede arreglar el
.
formulario usando--exclude
:fuente
Actualización: agregué una solución para el comentario del OP.
de hecho cambiará el directorio actual, pero ¿por qué no colocar el archivo en otro lugar?
tar -czf somewhereelse/workspace.tar.gz . mv somewhereelse/workspace.tar.gz . # Update
fuente
En realidad, el problema está en las opciones de compresión. El truco consiste en enviar el resultado del alquitrán a un compresor en lugar de utilizar las opciones integradas. Por cierto, eso también puede brindarle una mejor compresión, ya que puede establecer opciones de compresión adicionales.
Alquitrán mínimo:
Tubería a un compresor de su elección. Este ejemplo es detallado y usa xz con máxima compresión:
La solución se probó en Ubuntu 14.04 y Cygwin en Windows 7. Es una respuesta de la wiki de la comunidad, así que no dude en editarla si detecta un error.
fuente
El problema con la mayoría de las soluciones proporcionadas aquí es que tar contiene
./
al principio de cada entrada. Entonces, esto da como resultado tener un.
directorio al abrirlo a través del compresor GUI. Entonces, lo que terminé haciendo es:ls -1A | xargs -d "\n" tar cfz my.tar.gz
Si ya lo tiene
my.tar.gz
en el directorio actual, es posible que desee eliminar esto:ls -1A | grep -v my.tar.gz | xargs -d "\n" tar cfz my.tar.gz
Tenga en cuenta que xargs tiene cierto límite (ver
xargs --show-limits
). Entonces, esta solución no funcionaría si está tratando de crear un paquete que tiene muchas entradas (directorios y archivos) en un directorio que está tratando de tar.fuente
Buena pregunta. En ZSH puede usar el modificador globbing
(D)
, que significa "dotfiles". Comparar:ls $HOME/*
y
ls $HOME/*(D)
Esto excluye correctamente las entradas especiales del directorio
.
y..
. En Bash puede usar.*
para incluir los archivos de puntos explícitamente:ls $HOME/* $HOME/.*
Pero eso incluye
.
y..
también, así que no es lo que estabas buscando. Estoy seguro de que también hay alguna forma de hacer*
coincidir los archivos de puntos en bash.fuente
.??*
para hacer coincidir todos los archivos dot no.
y..
. Eso no obtiene archivos de puntos de un solo carácter (como.a
). Para obtenerlos también, use el más complicado.[^.]*
.Otra solución más, asumiendo que la cantidad de elementos en la carpeta no es enorme:
(
ls -A
imprime archivos normales y ocultos pero no "." y ".." como lols -a
hace).fuente
La especificación
.??*
incluirá archivos y directorios con "puntos" que tengan al menos 2 caracteres después del punto. El lado negativo es que no incluirá archivos / directorios con un solo carácter después del punto, por ejemplo.a
, si hay alguno.fuente
Si el espacio en el disco no es un problema, esto también podría ser algo muy fácil de hacer:
fuente
Yo mismo tuve una situación similar. Creo que es mejor crear el tar en otro lugar y luego usar -C para decirle a tar el directorio base para los archivos comprimidos. Ejemplo:
De esta forma, no es necesario excluir su propio archivo tar. Como se señaló en otros comentarios, -A enumerará los archivos ocultos.
fuente
10 años después, tiene una alternativa a
tar
, ilustrada con Git 2.30 (Q1 2021), que usa "git archive
" ( man ) para producir el tarball de lanzamiento en lugar de tar.(No necesita Git 2.30 para aplicar esa alternativa)
Consulte la confirmación 4813277 (11 de octubre de 2020) y la confirmación 93e7031 (10 de octubre de 2020) de René Scharfe (
rscharfe
) .(Combinado por Junio C Hamano -
gitster
- en el compromiso 63e5273 , 27 de octubre de 2020)Entonces en lugar de:
Puedes hacerlo usando solo Git:
Eso se propuso inicialmente porque, como se explica aquí , alguna plataforma exótica podría tener una distribución de alquitrán antigua sin opciones.
fuente
Usar
find
es probablemente la forma más fácil:find . -maxdepth 1 -exec tar zcvf workspace.tar.gz {} \+
find . -maxdepth 1
encontrará todos los archivos / directorios / enlaces simbólicos / etc en el directorio actual y ejecutará el comando especificado por-exec
. El{}
en el comando significa que la lista de archivos va aquí y\+
significa que el comando se ejecutará como:en vez de
fuente