¿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.

Solución

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 con foo.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, si shopt -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):

zip -r myfiles.zip mydir

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; escriba man 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.

Comentarios (16)

En mi caso quería comprimir cada archivo en su propio archivo, así que hice lo siguiente (en zsh):

$ for file in *; do zip ${file%.*}.zip $file; done
Comentarios (3)

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 de find no soporta el final + para exec. Aunque será más lento...)

Esto incluirá por defecto todos los subdirectorios. En GNU find -maxdepth puede evitarlo.

Comentarios (1)