¿Cómo comprimir varios archivos en archivos separados?

¿Cómo comprimir varios archivos en archivos separados?

Admito que esta pregunta se hizo aquí antes:

ComoComprimir en archivos separadosdonde la persona que preguntó no especificó el sistema operativo que usaba y no recibió respuestas.

Necesito separar un directorio enorme en varios archivos .zip que no sean interdependientes entre sí. Entonces, en lugar de:

archivo1.zip
archivo2.z01
archivo3.z02

En su lugar, me gustaría el siguiente conjunto de archivos:

archivo1.zip
archivo2.zip
archivo3.zip

Básicamente esta es mi pregunta. Estoy en OS X, por lo que un script de shell o AppleScript sería la forma más fácil de hacerlo.

Además, aquí hay un tipo que preguntó lo mismo, solo que quería crear un archivo .tar: CómoCrear archivos separados para un conjunto de archivos

La respuesta es correcta, pero generará archivos tar:

for file in `ls *`; do tar -czvf $file.tar.gz $file ; done

PD: Esta última parte es sólo para aquellos de ustedes que están aptos para Keyboard Maestro:

También intenté realizar esto en Keyboard Maestro, tengo una configuración de acción "para cada" que determina las rutas de los archivos y luego activa un script de shell. La salida es correcta y la macro funciona si la pego en la terminal (por ejemplo zip /Users/me/Desktop/test /Users/me/Desktop/test.txt).

Sin embargo, cuando paso las dos variables al script de shell en Keyboard Maestro no funcionará:
zip "$KMVAR_zipPath" "$KMVAR_sourcePath"

Respuesta1

La solución es bastante fácil. Si desea hacer esto para cada archivo, de forma recursiva, utilice find. Enumerará todos los archivos y directorios, descendiendo también a subdirectorios.

find . -type f -execdir zip '{}.zip' '{}' \;

Explicación:

  • El primer argumento es el directorio en el que desea comenzar,.
  • Luego lo restringiremos para buscar solo archivos ( -type f)
  • La -execdiropción nos permite ejecutar un comando sobre cada archivo encontrado, ejecutándolo desde el directorio del archivo
  • Este comando se evalúa como zip file.txt.zip file.txt, por ejemplo, ya que todas las apariciones de {}se reemplazan con el nombre de archivo real. Este comando debe terminar con\;

Por supuesto, findtiene más opciones. Si, en cambio, solo desea permanecer en su directorio actual, sin descender a subdirectorios:

find . -type f -maxdepth 1 -execdir zip '{}.zip' '{}' \;

Si desea restringirlo a ciertos tipos de archivos, use la -nameopción (o -inamepara una coincidencia que no distinga entre mayúsculas y minúsculas):

find . -type f -name "*.txt" …

Cualquier otra cosa (incluido el bucle sobre forla salida de ls *) es una sintaxis bastante fea en mi opinión y es probable que se rompa, por ejemplo, en archivos con espacios en su nombre o debido a demasiados argumentos.

información relacionada