Você pode montar o arquivo com o archivemount ou o mountavfs e recriá-lo novamente
archivemount tarfile.tar /mnt
cd /mnt
tar cf /tmp/tarfile.tar --transform 's/foo/bar/' .
as operações de gravação no sistema de arquivos de arquivos farão uma reescrita completa no umount, então não pareça uma boa opção para arquivos grandes.
EDITAR
Eu não sei detalhes de implementação, mas parece que estamos salvando os arquivos de gravação na etapa do sistema de arquivos.
Apenas teste para resolver dudes (em um tar do meu / usr)
#!/bin/bash
# try to avoid slab cache issues
cat /tmp/usr.tar > /dev/null
T="$(date +%s)"
tar xf /tmp/usr.tar
tar cf usr.tar usr --transform 's/usr/foo/'
T="$(($(date +%s)-T))"
echo "Tar/Untar seconds: ${T}"
T="$(date +%s)"
archivemount -o readonly -o nobackup /tmp/usr.tar /mnt
tar cf usr.tar /mnt --transform 's/usr/foo/'
umount /mnt
T="$(($(date +%s)-T))"
echo "Archivemount seconds: ${T}"
T="$(date +%s)"
mountavfs
cd '/root/.avfs/tmp/usr.tar#'
tar cf /tmp/test/usr.tar --transform 's/usr/foo/' .
T="$(($(date +%s)-T))"
echo "Avfs seconds: ${T}"
Saída:
Tar/Untar seconds: 480
Archivemount seconds: failure, a lot of read errors.
Avfs seconds: 217
Então Avfs vence! .