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águnzip
muchos pero no demasiados nombres de archivo en su línea de comando. Esto es más eficiente que el-exec gunzip {} \;
que inicia un nuevogunzip
proceso para todos y cada uno de los archivos.fuente
find
menosgunzip
!find
permiten la notación "+". Consulte, por ejemplo, lafind
pá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.
xargs
es 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.xargs
rellenará tantos nombres de archivos como quepan en lagunzip
línea de comando. ¡Intentalo!echo a b c d e f | xargs echo
solo se invocaecho
una vez con los 6 argumentos para que vea una línea de salida (comando bastante inútil para ejecutar, sin embargo !!!!), mientras que si obligaxargs
a 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 .xargs
es que, con la-P
opción, puede ejecutar múltiplesgunzip
procesos 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
find
con+
yxargs
está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
gunzip
una 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
gunzip
no va a maximizar las capacidades de su máquina. Para eso necesitarías ejecutar múltiplesgunzip
s 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
parallel
es demasiado larga?find
es demasiado larga?find
la línea de comando.-name
No es necesario usarlo
find
para esto, ya que no mencionó subcarpetas. Lo que debes hacer es:fuente
find
si no quiere desovar 320116gunzip
procesos, al igual que lo hace este bucle.