Voici une autre solution. Il ne vous permet pas d'extraire des fichiers individuels d'une archive et de réduire sa taille, mais il vous permet d'extraire tous les fichiers en réduisant la taille de l'archive au fur et à mesure :
#!/bin/sh
# $1, the first paramter, is the .tar.gz file to unarchive
(
size=$(wc -c $1)
offset=0
bs=4096
while [[ $size > $offset ]]; do
dd if=$1 bs=$bs count=1 skip=$offset status=none
fallocate -p -o $offset -l $bs $1
offset=$(( $offset + $bs ))
done
) | tar xz
Enregistrez ceci dans un fichier comme par ex. untar_and_destroy.sh
et exécuter en tant que :
untar_and_destroy.sh whatever.tar.gz
Cela donne une partie du .tar.gz
fichier en tar, demande à Linux de désallouer cette partie du fichier, puis répète pour la partie suivante. Lorsque vous avez terminé, ls -l
dira le .tar.gz
les fichiers ont la même taille qu'avant, mais du
rapportera sa taille comme 0. C'est parce que le .tar.gz
a été transformé en un fichier clairsemé, avec la même longueur qu'auparavant mais comme tous les 0 qui n'ont pas besoin d'être stockés sur le disque.
Ne l'utilisez pas en production, ou n'importe où où la suppression de cette archive serait mauvaise. Cela rend l'archive illisible dès qu'elle démarre, donc si quelque chose ne va pas, par ex. vous manquez d'espace sur le disque dur lors de l'extraction, vous n'aurez pas une seconde chance de l'exécuter.
Bien qu'il ne soit pas pratique d'étendre votre stockage principal, vous pouvez peut-être extraire le contenu du fichier sur un périphérique de stockage externe.
Alternativement, générez une liste de fichiers dans l'archive, puis écrivez un script qui en extrait certains. Déplacez ces fichiers vers le cloud, sélectionnez un autre lot à extraire, faites mousser, rincez, répétez.
Mais, chaque application d'archivage que je connais doit avoir le fichier d'archive d'origine intact pendant qu'elle crée un nouveau fichier d'archive sans ce que vous ne voulez pas, donc le stockage externe va être très, très utile.
Je ne connais aucun outil capable de le faire, et je ne pense pas qu'aucun des formats d'archivage courants ne le prenne en charge.
Une solution possible à votre problème serait de conserver l'archive sur une autre machine et de la diriger vers la machine sur laquelle vous souhaitez la décompresser. Par exemple, vous pouvez exécuter cette commande sur la machine contenant l'archive :
cat archive.tar.gz | ssh YOUR_SERVER tar xfz -
L'archive sera diffusée sur le tar
processus en cours d'exécution sur le serveur, qui le décompressera sans que l'archive soit jamais présente sur le serveur.