ver todos otro mover los ejemplos directorio crear copiar contenido comandos comando basicos archivos archivo linux bash design-patterns tar

linux - otro - tar: agregue todos los archivos y directorios en el directorio actual INCLUYENDO.svn y así sucesivamente



mover todos los archivos de un directorio a otro en linux (15)

El problema con la mayoría de las soluciones proporcionadas aquí es que tar contiene ./ al inicio de cada entrada. Entonces esto resulta en tener . 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 tiene my.tar.gz en el directorio actual, es posible que desee agotar 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 (vea xargs --show-limits ). Por lo tanto, esta solución no funcionaría si está intentando crear un paquete que tiene muchas entradas (directorios y archivos) en un directorio que está intentando atacar.

Intento tar.gz un directorio y uso

tar -czf workspace.tar.gz *

El alquitrán resultante incluye directorios .svn en subdirectorios pero NO en el directorio actual (ya que * se expande a solo archivos ''visibles'' antes de pasarlo a tar

lo intenté

tar -czf workspace.tar.gz . en su lugar, pero luego recibo un error porque ''.'' ha cambiado mientras leía:

tar: ./workspace.tar.gz: file changed as we read it

¿Hay algún truco para que * coincida con todos los archivos (incluido el prefijo de puntos) en un directorio?

(usando bash en Linux SLES-11 (2.6.27.19)


En realidad, el problema es con las opciones de compresión. El truco es la tubería que el alquitrán resulta en un compresor en lugar de usar las opciones incorporadas. Por cierto, eso también puede proporcionarle una mejor compresión, ya que puede establecer opciones adicionales de compresión.

Alquitrán mínimo:

tar --exclude=*.tar* -cf workspace.tar .

Conecte a un compresor de su elección. Este ejemplo es detallado y usa xz con compresión máxima:

tar --exclude=*.tar* -cv . | xz -9v >workspace.tar.xz

La solución fue probada en Ubuntu 14.04 y Cygwin en Windows 7. Es una respuesta wiki de la comunidad, así que siéntase libre de editar si detecta un error.


Hay un par de pasos a seguir:

  1. Reemplazar * por . para incluir archivos ocultos también.
  2. Para crear el archivo en el mismo directorio a --exclude=workspace.tar.gz se puede utilizar para excluir el archivo en sí.
  3. Para evitar que el tar: .: file changed as we read it cuando el archivo aún no se haya creado, asegúrese de que existe (por ejemplo, usando el botón touch ), de modo que el --exclude coincida con el nombre del archivo comprimido. (No coincide con el archivo no existe)

Combinados, esto da como resultado el siguiente script:

touch workspace.tar.gz tar -czf workspace.tar.gz --exclude=workspace.tar.gz .


No cree el archivo tar en el directorio que está empacando:

tar -czf /tmp/workspace.tar.gz .

hace el truco, excepto que extraerá los archivos en todo el directorio actual cuando desempaque. 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ó los enlaces simbólicos para llegar a donde está y que el intérprete de comandos no intenta adivinarlo saltando hacia atrás a través de un enlace simbólico - bash no es confiable a este respecto. Si tiene que preocuparse por eso , use cd -P .. para hacer un directorio de cambios físicos. Estúpido que no es el comportamiento predeterminado en mi opinión - confuso, al menos, para aquellos para quienes cd .. nunca tuvo ningún significado alternativo.)

Un comentario en la discusión dice:

Necesito excluir el directorio superior y [...] necesito ubicar el tar en el directorio base.

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 una de dos maneras:

  1. O bien: cree el archivo en otro lugar - /tmp es una ubicación posible - y luego vuelva a moverlo a la ubicación original una vez que se haya completado.
  2. O bien: si está utilizando GNU Tar, use la --exclude=workspace.tar.gz . La cadena después de = es un patrón, el ejemplo es el patrón más simple, una coincidencia exacta. Es posible que necesite 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á trabajando en un nivel como se sugiere. Si tiene varios archivos tar para excluir, use '' * '', como en --exclude=./*.gz .

Otra solución más, suponiendo que la cantidad de elementos en la carpeta no es enorme:

tar -czf workspace.tar.gz `ls -A`

( ls -A imprime archivos normales y ocultos pero no "." y ".." como ls -a hace.)


Puede incluir los directorios ocultos volviendo un directorio y haciendo:

cd .. tar -czf workspace.tar.gz workspace

Suponiendo que el directorio que quería gzip se llamaba espacio de trabajo.


Puedes arreglar el . forma mediante el uso de --exclude :

tar -czf workspace.tar.gz --exclude=workspace.tar.gz .


Si realmente no desea incluir el directorio superior en el tarball (y eso generalmente es una mala idea):

tar czf workspace.tar.gz -C /path/to/workspace .


Si el espacio en el disco no es un problema, también podría ser algo muy fácil de hacer:

mkdir backup cp -r ./* backup tar -zcvf backup.tar.gz ./backup


Tuve una situación similar yo mismo. Creo que es mejor crear el alquitrán en otro lugar y luego usar -C para indicarle al tar el directorio base para los archivos comprimidos. Ejemplo:

tar -cjf workspace.tar.gz -C <path_to_workspace> $(ls -A <path_to_workspace>)

De esta forma, no hay necesidad de excluir su propio archivo tar. Como se señala en otros comentarios, -A enumerará los archivos ocultos.


Una buena pregunta. En ZSH puede usar el modificador globbing (D) , que significa "archivos de puntos". Comparar:

ls $HOME/*

y

ls $HOME/*(D)

Esto excluye correctamente las entradas de directorio especiales . y .. En Bash puedes usar .* Para incluir los archivos de puntos explícitamente:

ls $HOME/* $HOME/.*

Pero eso incluye . y .. también, entonces no es lo que estabas buscando. Estoy seguro de que hay alguna manera de hacer que * match dotfiles en bash, también.


Usar find es probablemente la forma más fácil:

find . -maxdepth 1 -exec tar zcvf workspace.tar.gz {} /+

find . -maxdepth 1 find . -maxdepth 1 encontrará todos los archivos / directorios / symlinks / 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:

tar zcvf workspace.tar.gz .file1 .file2 .dir3

en lugar de

tar zcvf workspace.tar.gz .file1 tar zcvf workspace.tar.gz .file2 tar zcvf workspace.tar.gz .dir3


en el directorio quiere comprimir (directorio actual) intente esto:

tar -czf workspace.tar.gz . --exclude=./*.gz


Actualización: agregué una solución para el comentario del OP.

tar -czf workspace.tar.gz .

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


tar -czf workspace.tar.gz .??* *

Especificar .??* incluirá archivos y directorios "dot" que tengan al menos 2 caracteres después del punto. El inconveniente es que no incluirá archivos / directorios con un solo carácter después del punto, como .a , si hay alguno.