Suponga que tengo un gzip comprimido tar-ball compressedArchive.tgz (+100 archivos, totalizando + 5gb).
¿Cuál sería la forma más rápida de eliminar todas las entradas que coincidan con un patrón de nombre de archivo dado, por ejemplo, el prefijo * .jpg y luego almacenar los restos en un gzip: ed tar-ball nuevamente?
Reemplazar el archivo antiguo o crear uno nuevo no es importante, lo que sea más rápido.

Respuestas:
Con GNU
tar, puedes hacer:Con
bsdtar:(
pigzsiendo la versión multiproceso degzip).Puede sobrescribir el archivo sobre sí mismo como:
Pero eso es bastante arriesgado, especialmente si el resultado termina siendo menos comprimido que el archivo original (en cuyo caso, el segundo
pigzpuede terminar sobrescribiendo áreas del archivo que el primero aún no ha leído).fuente
No descarte la manera fácil: puede ser lo suficientemente rápido para su propósito. Con avfs para acceder al archivo como directorio:
Con herramientas más primitivas, primero extraiga los archivos excluyendo los
.jpgarchivos, luego cree un nuevo archivo.Si su alquitrán tiene
--exclude:Sin embargo, esto puede alterar la propiedad y los modos del archivo si no lo ejecuta como root. Para obtener mejores resultados, use un directorio temporal en un sistema de archivos rápido: tmpfs si tiene uno que sea lo suficientemente grande.
El soporte para que los archivadores actúen como una transferencia (es decir, leer un archivo y escribir un archivo) tiende a ser limitado. GNU tar puede eliminar miembros de un archivo con la
--deleteopción de operación ( “La--deleteopción se ha informado que funcionan correctamente cuando setaractúa como un filtro destdinastdout.”), Y eso es probablemente su mejor opción.Puede crear potentes filtros de archivo en unas pocas líneas de Python. Su
tarfilebiblioteca puede leer y escribir desde secuencias no buscables, y puede usar código arbitrario en Python para filtrar, renombrar, modificar ...fuente
tar, es posible que desee agregar lapopción.Con el tar que viene en Mac OSX, puede hacer esto:
fuente
Para hacer esto, probablemente deba extraer todo el contenido del archivo .tgz en un directorio local, luego borrar los archivos que no desea y luego volver a comprimir el .tgz.
Es largo y necesita suficiente espacio libre en el disco, pero que yo sepa, no hay otra manera de hacerlo.
Dado que ya tiene alguna ruta como
/tmpdir/withalotofspaceesa, tiene suficiente espacio libre (verifíquela usandodf -h /tmpdir/withalotofspace), puede hacer algo como esto:fuente
Me gusta la respuesta de @Gilles, excepto que se puede simplificar aún más. Después de descomprimir, por ejemplo,
gunzip foo.tgzel archivo seráfoo.tary los archivos se pueden eliminar contar -f foo.tar --delete file|directory. A continuación se muestra un ejemplo de eliminación de un directorio de un archivo tar.Se pueden encontrar tipos de archivos específicos con
tar -tf foo.tar|egrep -i '.jpg$'.fuente