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:
- Reemplazar
*
por.
para incluir archivos ocultos también. - Para crear el archivo en el mismo directorio a
--exclude=workspace.tar.gz
se puede utilizar para excluir el archivo en sí. - 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óntouch
), 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:
- 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. - 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.