¿Comprimir todos los archivos del directorio?
¿Hay alguna manera de comprimir todos los archivos de un directorio determinado con el comando zip
? He oído hablar de usar *.*
, pero quiero que funcione también para los archivos sin extensión.
487
3
Puede utilizar simplemente
*
; no es necesario utilizar*.*
. Las extensiones de archivos no son especiales en Unix. El símbolo "*" coincide con cero o más caracteres, incluyendo un punto. Por lo tanto, coincide confoo.png
, porque son cero o más caracteres (siete, para ser exactos).Tenga en cuenta que
*
no coincide por defecto con los archivos que empiezan por un punto (tampoco lo hace*.*
). Esto es a menudo lo que quieres. Si no, en bash, sishopt -s dotglob
lo hará (pero seguirá excluyendo.
y..
). Otros shells tienen diferentes maneras (o ninguna) de incluir los archivos de puntos.Alternativamente,
zip
también tiene una opción-r
(recursiva) para hacer árboles de directorios enteros a la vez (y no tener que preocuparse por el problema de los archivos de puntos):donde
mydir
es el directorio que contiene sus archivos. Tenga en cuenta que el zip producido contendrá la estructura de directorios, así como los archivos. Como señala peterph en su comentario, esto suele considerarse positivo: al extraer el zip se almacenan ordenadamente todos los archivos extraídos en un subdirectorio.También puedes decirle a zip que no almacene las rutas con la opción
-j
/--junk-paths
.El comando
zip
viene con documentación que le informa sobre todas sus (muchas) opciones; escribaman zip
para ver esa documentación. Esto no es exclusivo de zip; puede obtener documentación para la mayoría de los comandos de esta manera.En mi caso quería comprimir cada archivo en su propio archivo, así que hice lo siguiente (en
zsh
):Otra forma sería usar find y xargs: (esto podría incluir un directorio "." en el zip, pero debería seguir extrayendo correctamente. En mi prueba, el zip eliminó el punto antes de la compresión)
find . -type f -exec zipfile.zip {} +
(El
+
puede ser sustituido por\;
si su versión defind
no soporta el final+
para exec. Aunque será más lento...)Esto incluirá por defecto todos los subdirectorios. En GNU find
-maxdepth
puede evitarlo.