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
:(
pigz
siendo 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
pigz
puede 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
.jpg
archivos, 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
--delete
opción de operación ( “La--delete
opción se ha informado que funcionan correctamente cuando setar
actúa como un filtro destdin
astdout
.”), Y eso es probablemente su mejor opción.Puede crear potentes filtros de archivo en unas pocas líneas de Python. Su
tarfile
biblioteca 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 lap
opció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/withalotofspace
esa, 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.tgz
el archivo seráfoo.tar
y 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