it-swarm-es.com

Zip todos los archivos en el directorio?

¿Hay alguna manera de comprimir todos los archivos en un directorio dado con el comando Zip? He oído hablar de usar *.*, pero también quiero que funcione para archivos sin extensión.

523
tkbx

Puedes usar *; no hay necesidad de *.*. Las extensiones de archivo no son especiales en Unix. * Coincide con cero o más caracteres, incluido un punto. Entonces coincide con foo.png, Porque eso es cero o más caracteres (siete, para ser exactos).

Tenga en cuenta que * Por defecto no coincide con los archivos que comienzan con un punto (tampoco *.*). Esto es a menudo lo que quieres. Si no, en bash, si usted shopt -s dotglob Lo hará (pero aún excluirá . Y ..). Otros shells tienen diferentes formas (o ninguna) de incluir archivos de puntos.

Alternativamente, Zip también tiene una opción -r (Recursiva) para hacer árboles de directorios completos a la vez (y no tener que preocuparse por el problema del archivo 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 del directorio, así como los archivos. Como señala Peter en su comentario, esto generalmente se ve como algo bueno: extraer el Zip almacenará perfectamente todos los archivos extraídos en un subdirectorio.

También puede 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.

753
derobert

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
15
Radon Rosborough

Otra forma sería usar find y xargs: (esto podría incluir un directorio "." En el Zip, pero aún así debería extraerse correctamente. Con mi prueba, Zip eliminó el punto antes de la compresión) find . -type f -exec Zip zipfile.Zip {} +

(Los + se puede reemplazar con \; si su versión de find no es compatible con + fin para el ejecutivo. Sin embargo, será más lento ...)

Esto incluirá por defecto todos los subdirectorios. On GNU find -maxdepth puede evitar eso.

8
Gert van den Berg

Otro método (lento) para hacer esto (que agrega un archivo al Zip a la vez):

for f in * .[^.]*; do
    [ -r "$f" ] || continue # Skip directories or non-existant files (Probably ".[^.]*" if directory has no dotfiles). Using -e will allow directories to be used as well
    Zip zipfile.Zip "$f" # If directories are included, you probably want to add -r
done

Esto tiene los problemas dotfile de * (solución alternativa agregada) e iniciaría Zip una vez para cada archivo, agregándolo al archivo. En bash, trataría con una gran cantidad de archivos.

Sería más lento que la mayoría de los otros métodos, pero es relativamente simple.

2
Gert van den Berg