¿Hay alguna manera de comprimir todos los archivos en un directorio dado con el zip
comando? He oído hablar del uso *.*
, pero también quiero que funcione para archivos sin extensión.
command-line
wildcards
zip
tkbx
fuente
fuente
zip myarch.zip mydir/*
?zip -r myarch.zip mydir/*
zip -r myarch.zip mydir
*.*
significa cualquier archivo con un punto. En cp / my dos todos los archivos tenían un punto, y te hizo escribirlo (no se pudo hacer*
). Por lo tanto, la gente llegó a ver*.*
como todos los archivos. Finalmente, Microsoft agregó nombres de archivo largos que podrían tener cero o más puntos. Para buscar un archivo que tenga un punto en Windows, debe escribir*.*.*
.Respuestas:
Solo 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 coincidefoo.png
, porque eso es cero o más caracteres (siete, para ser exactos).Tenga en cuenta que,
*
de forma predeterminada, no coincide con los archivos que comienzan con un punto (tampoco lo hace*.*
). Esto es a menudo lo que quieres. Si no, en bash, sishopt -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-r
opción (recursiva) para hacer árboles de directorios completos a la vez (y no tener que preocuparse por el problema del archivo de puntos):donde
mydir
está el directorio que contiene tus 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
zip
comando 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.fuente
*
el bloqueo de shell no incluye archivos de puntos (es decir, nombres de archivo que comienzan con.
). Esta es otra ventaja de comprimir todo el directorio por su nombre..
y..
?En mi caso, quería comprimir cada archivo en su propio archivo, así que hice lo siguiente (en
zsh
):fuente
mkv
aqui? Además, nada aquí es particularmentezsh
específico. Deberá citar correctamente cualquier variable que contenga un nombre de archivo, por lo tanto,zip "${file%.*}.zip" "$file"
con las comillas dobles alrededor de ambas variables.mkv
. En segundo lugar, es innecesario citar argumentoszsh
, a diferencia debash
. Es por eso que especifiqué que este era un comando parazsh
.find . -type f -maxdepth 1 -print0|xargs -r0 -n1 -P64 -I{} bash -c 'f="{}"; zip "${f%.*}.zip" "$f"'
(-P
ajustado según los hilos de su CPU ...) (Muchas dependencias de GNU ...)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 {} +
(Se
+
puede reemplazar con\;
si su versión defind
no admite el+
final para exec. Sin embargo, será más lento ...)Esto incluirá por defecto todos los subdirectorios. En GNU find
-maxdepth
puede evitar eso.fuente
*
, esto incluirá archivos de puntos y no se caerá si hay demasiados archivos en un directorio)Otro método (lento) para hacer esto (que agrega un archivo al zip a la vez):
Esto tiene los problemas de
*
archivo de puntos de (solución agregada) y se iniciará zip una vez para cada archivo, agregándolo al archivo. Enbash
, 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.
fuente
for f in *; do zip zip.zip "$f"; done