No descarte la manera fácil: puede ser lo suficientemente rápido para su propósito. Con avfs para acceder al archivo como directorio:
cd ~/.avfs/path/to/original.tar.gz\#
pax -w -s '/^.*\.jpg$//' | gzip >/path/to/filtered.tar.gz # POSIX
tar -czf /path/to/filtered.tar.gz -s '/^.*\.jpg$//' . # BSD
tar -czf /path/to/filtered.tar.gz --transform '/^.*\.jpg$//' . # GNU
Con herramientas más primitivas, primero extraiga los archivos excluyendo los .jpg
archivos, luego cree un nuevo archivo.
mkdir tmpdir && cd tmpdir
<original.tar.gz gzip -d | pax -r -pe -s '/^.*\.jpg$//'
pax -w . | gzip >filtered.tar.gz
cd .. && rm -rf tmpdir
Si su alquitrán tiene --exclude
:
mkdir tmpdir && cd tmpdir
tar -xzf original.tar.gz --exclude='*.jpg'
tar -czf filtered.tar.gz .
cd .. && rm -rf tmpdir
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 se tar
actúa como un filtro de stdin
a stdout
.”), 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 ...
#!/usr/bin/python
import re, sys, tarfile
source = tarfile.open(fileobj=sys.stdin, mode='r|*')
dest = tarfile.open(fileobj=sys.stdout, mode='w|gz')
for member in source:
if not (member.isreg() and re.match(r'.*\.jpg\Z', member.name)):
sys.stderr.write(member.name + '\n')
dest.addfile(member, source.extractfile(member))
dest.close()