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.z02En 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
-execdir
opció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, find
tiene 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 -name
opción (o -iname
para una coincidencia que no distinga entre mayúsculas y minúsculas):
find . -type f -name "*.txt" …
Cualquier otra cosa (incluido el bucle sobre for
la 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.