Tengo una carpeta que contiene aproximadamente 320116 archivos .pdb.gz. Quiero descomprimirlos a todos. Si uso gunzip * .gz me da un error, es decir, la lista de argumentos es demasiado larga. La carpeta es de aproximadamente 2 GB. Por favor dame una sugerencia apropiada.
13

Respuestas:
-exec gunzip {} +proporcionarágunzipmuchos pero no demasiados nombres de archivo en su línea de comando. Esto es más eficiente que el-exec gunzip {} \;que inicia un nuevogunzipproceso para todos y cada uno de los archivos.fuente
findmenosgunzip!findpermiten la notación "+". Consulte, por ejemplo, lafindpágina del manual para BSD 10.1 . También se aplica a OS X (10.9 y posterior al menos, tal vez antes).Siempre que obtenga errores de "lista de argumentos demasiado larga", puede solucionarlo invocando el comando deseado varias veces, cada vez con un subconjunto de los argumentos que desea usar.
xargses una herramienta que te ayuda a hacerlo automáticamente.fuente
-execdir gunzip "{}" \;ejemplo, xargs invocará gunzip por separado para cada archivo? Esa es mi lectura de la página man.xargsrellenará tantos nombres de archivos como quepan en lagunziplínea de comando. ¡Intentalo!echo a b c d e f | xargs echosolo se invocaechouna vez con los 6 argumentos para que vea una línea de salida (comando bastante inútil para ejecutar, sin embargo !!!!), mientras que si obligaxargsa proporcionar solo 3 argumentos por invocación del comando usandoecho a b c d e f | xargs -n 3 echo, obtendrá 2 líneas de salida .xargses que, con la-Popción, puede ejecutar múltiplesgunzipprocesos en paralelo, lo que (dependiendo de los parámetros exactos de su sistema) puede ir más rápido.-P@psmears. ¡Ahora también aprendí algo!Creo que esto debería funcionar, pasa la ruta / nombre de cada archivo individualmente a gunzip para su procesamiento:
fuente
findcon+yxargsestán expresamente diseñados con exactamente ese problema en mente. Siempre proporcionarán tantos argumentos como puedan, sin exceder el límite del sistema operativo. Porque, por cierto, es un límite del sistema operativo, nada que vergunzip.Intenta de esta manera:
fuente
gunzipuna vez por archivo. Vea la respuesta de John1024 para una forma ligeramente diferente que evita esa ineficiencia.Si tiene una máquina multinúcleo, probablemente verá que el uso
gunzipno va a maximizar las capacidades de su máquina. Para eso necesitarías ejecutar múltiplesgunzips en paralelo. Hacer un seguimiento de qué se hace en qué terminal a mano es engorroso, pero puede hacerlo fácilmente con GNU paralelo:fuente
paralleles demasiado larga?findes demasiado larga?findla línea de comando.-nameNo es necesario usarlo
findpara esto, ya que no mencionó subcarpetas. Lo que debes hacer es:fuente
findsi no quiere desovar 320116gunzipprocesos, al igual que lo hace este bucle.