Aqui está um script bash
para extrair recursivamente um arquivo tar
, remover os arquivos aninhados originais e criar um novo arquivo. Leva dois argumentos - primeiro é o arquivo original, segundo é o nome do novo arquivo. Ambos devem ser caminhos relativos. Isto irá extrair o diretório do arquivo, mas se recusará a atacar os arquivos existentes (para isso, remova a opção -k
do comando tar
). Outra abordagem para evitar a invasão seria criar um novo diretório para cada arquivo e extraí-lo lá.
#!/bin/bash
archive="$1"
new_archive="$2"
# common extensions, full list at
# http://www.gnu.org/software/tar/manual/html_section/Compression.html#auto_002dcompress
match_archives='.*\.\(tar\|\(tar\.\(gz\|bz2\|xz\)\)\|\(tgz\|tbz\)\)$'
recursive_extract ()
{
retval=0
while read -rd '' path
do
if [ -e "$path" ]
then
nested_archive=${path##*/}
if cd "${path%/*}" && tar -xakf "$nested_archive"
then
rm "$nested_archive"
find . -regex "$match_archives" -print0 | recursive_extract
retval=$?
else
echo "Error extracting $nested_archive, not removing"
retval=1
fi
fi
done
return $retval
}
tmpdir=$(mktemp -d)
cd "$tmpdir"
tar -xaf "$OLDPWD/$archive" &&
find . -regex "$match_archives" -print0 | recursive_extract &&
tar -caf "$OLDPWD/$new_archive" * &&
cd -- "$OLDPWD" &&
rm -rf $tmpdir ||
echo "Errors, please review $tmpdir"
Observe que, se a extração resultar em um erro, é possível que o acima tente extrair o mesmo arquivo várias vezes.