Yo típicamente hago:
tar -czvf my_directory.tar.gz my_directory
¿Qué sucede si solo quiero incluir todo (incluidos los archivos ocultos del sistema) en my_directory, pero no el directorio en sí? No quiero
my_directory
--- my_file
--- my_file
--- my_file
Quiero:
my_file
my_file
my_file
tar -czf
? En mi caso, solo está almacenando los archivos y no el directorio. Cuando acabo detar
incluir el directorio, lo incluye perotar -czf
solo agrega los archivos.Respuestas:
debería hacer el trabajo en una línea. Funciona bien para archivos ocultos también. "*" no expande los archivos ocultos por expansión de nombre de ruta al menos en bash. A continuación se muestra mi experimento:
fuente
.
con*
el comando,cd my_directory/ && tar -zcvf ../my_dir.tgz * && cd ..
entonces funcionará como esperaba.$ (cd my_directory/ && tar -zcvf ../my_dir.tgz .)
cd
entrar en directorios y salir es bastante aburrido. Al menos podría usarpushd
ypopd
sitar
no tuviera ninguna bandera como-C
.Usa el
-C
interruptor de alquitrán:El
-C my_directory
le dice a tar que cambie el directorio actual amy_directory
, y luego.
significa "agregar todo el directorio actual" (incluidos los archivos y subdirectorios ocultos).Asegúrese de hacerlo
-C my_directory
antes de hacerlo.
o de lo contrario obtendrá los archivos en el directorio actual.fuente
tar --create --file=foo.tar -C /etc passwd hosts -C /lib libc.a
" apl.jhu.edu/Misc/Unix-info/tar/tar_65.html Siempre intentotar -czvf my_directory.tar.gz * -C my_directory
y eso no funciona.-C
la ubicación es importante! Maldita alquitrán ...*
no incluirá archivos ocultos (que era el requisito original).También puede crear un archivo como de costumbre y extraerlo con:
fuente
--strip-components
es una extensión GNU.Echa un vistazo a
--transform
/--xform
, te da la oportunidad de masajear el nombre del archivo a medida que el archivo se agrega al archivo:La expresión de transformación es similar a la de
sed
, y podemos usar separadores distintos de/
(,
en el ejemplo anterior).https://www.gnu.org/software/tar/manual/html_section/tar_52.html
fuente
file list too long
. Mi solución lo impide y también es más flexible.--xform
varias veces por múltiples caminos.TL; DR
Con algunas condiciones (archivar solo archivos, directorios y enlaces simbólicos):
Explicación
Lamentablemente, a continuación se incluye un directorio principal
./
en el archivo:Puede mover todos los archivos fuera de ese directorio utilizando la
--transform
opción de configuración, pero eso no elimina el.
directorio en sí. Se vuelve cada vez más difícil domar el comando.Puede usar
$(find ...)
para agregar una lista de archivos al comando (como en la respuesta de magnus ), pero eso puede causar un error de "lista de archivos demasiado larga". La mejor manera es combinarlo con la-T
opción tar , de esta manera:Básicamente, lo que hace es enumerar todos los archivos (
-type f
), enlaces (-type l
) y subdirectorios (-type d
) en su directorio, hacer que todos los nombres de archivo sean relativos-printf "%P\n"
y luego pasar eso al comando tar (toma los nombres de archivo de STDIN usando-T -
). La-C
opción es necesaria para que tar sepa dónde se encuentran los archivos con nombres relativos. El--no-recursion
indicador es para que el alquitrán no vuelva a aparecer en las carpetas y se le ordena archivar (lo que provoca archivos duplicados).Si necesita hacer algo especial con los nombres de archivo (filtrado, seguimiento de enlaces simbólicos, etc.), el
find
comando es bastante poderoso, y puede probarlo simplemente eliminando latar
parte del comando anterior:Por ejemplo, si desea filtrar archivos PDF, agregue
! -name '*.pdf'
Búsqueda no GNU
El comando usa
printf
(disponible en GNUfind
) que le indicafind
que imprima sus resultados con rutas relativas. Sin embargo, si no tiene GNUfind
, esto funciona para que las rutas sean relativas (elimina a los padres consed
):fuente
Esta respuesta debería funcionar en la mayoría de las situaciones. Sin embargo, observe cómo los nombres de archivo se almacenan en el archivo tar como, por ejemplo, en
./file1
lugar de solofile1
. Descubrí que esto causaba problemas al usar este método para manipular tarballs utilizados como archivos de paquete en BuildRoot .Una solución es usar algunos globos de Bash para enumerar todos los archivos, excepto los
..
siguientes:Este es un truco que aprendí de esta respuesta .
Ahora tar devolverá un error si no hay archivos que coincidan
..?*
o.[^.]*
, pero seguirá funcionando. Si el error es un problema (está comprobando el éxito en un script), esto funciona:Aunque ahora estamos jugando con las opciones de shell, podríamos decidir que es mejor tener
*
archivos ocultos coincidentes:Esto podría no funcionar donde los globos de shell
*
en el directorio actual, así que, alternativamente, use:fuente
tar: start.sh: Cannot stat: No such file or directory
Esto sucede con todos los archivos de mi directorio actual! ¿Cómo evito esto?fuente
Si se trata de un sistema Unix / Linux y le interesan los archivos ocultos (que serán extrañados por *), debe hacer lo siguiente:
No sé cómo se ven los archivos ocultos en Windows.
fuente
Propondría la siguiente función Bash (el primer argumento es la ruta al directorio, el segundo argumento es el nombre base del archivo resultante):
Puedes ejecutarlo de esta manera:
y generará el archivo
my_archive.tar.gz
dentro del directorio actual. Funciona con elementos ocultos (. *) Y con elementos con espacios en su nombre de archivo.fuente
Este funcionó para mí e incluye todos los archivos ocultos sin poner todos los archivos en un directorio raíz llamado "." como en la respuesta de tomoe :
fuente
Ejemplo:
De nada.
fuente
Esto es lo que me funciona.
También podrías usar
En el primer comando, find devuelve una lista de archivos y subdirectorios de my_dir . Sin embargo, el directorio my_dir está incluido en esa lista como '.' El -printf parámetro elimina la ruta completa, incluido ese '.' y también todoscrlf Sin embargo, el espacioen la cadena de formato '% P' de printf deja un remanente en la lista de archivos y subdirectorios de my_dir y puede verse por un espacio inicial en el resultado del comando find .
Eso no será un problema para TAR, pero si desea solucionarlo, agregue -mindepth 1 como en el segundo comando.
fuente
Usa pax.
Pax es un paquete obsoleto pero hace el trabajo perfectamente y de manera simple.
fuente
La forma más simple que encontré:
cd my_dir && tar -czvf ../my_dir.tar.gz *
fuente
Maneja de forma segura los nombres de archivos con espacios u otros caracteres inusuales. Opcionalmente, puede agregar un
-name '*.sql'
filtro similar al comando de búsqueda para limitar los archivos incluidos.fuente
Si la carpeta es mytemp, si aplica lo anterior, comprimirá y eliminará todos los archivos de la carpeta, pero lo dejará solo
Puede dar patrones de exclusión y también especificar no buscar en subcarpetas.
fuente
fuente