J'ai un lecteur de 100 Go contenant un fichier de 95 Go. J'ai besoin de libérer de l'espace sur le lecteur (et pour le moment, le transfert du fichier hors du lecteur n'est pas une option). Le fichier se comprimerait bien avec gzip
ou bz2
ou autre chose, mais tous ces programmes écrivent le fichier compressé dans un fichier séparé. Je n'ai pas assez d'espace libre pour cela.
Existe-t-il un moyen d'utiliser des outils de compression standard ou d'autres utilitaires Unix pour compresser le fichier sans utiliser d'espace disque supplémentaire (ou au moins une quantité minimale d'espace disque supplémentaire)? J'imagine quelque chose qui comprime une partie du fichier à la fois et écrit les résultats directement sur le fichier. Je me rends compte que ce serait risqué, car le fichier serait corrompu si la compression était interrompue, mais je ne pense pas avoir le choix.
Réponses:
C'est une preuve de concept bash one-liner, mais elle devrait vous aider à démarrer. À utiliser à vos risques et périls.
Cela fonctionne en redirigeant les données gz vers un processus dd qui les réécrit dans le même fichier. Une fois terminé, le fichier est tronqué à la taille de la sortie gz.
Cela suppose que la dernière ligne de la sortie de dd correspond:
Où le premier champ est un entier d'octets écrits. Il s'agit de la taille à laquelle le fichier devra être tronqué. Je ne suis pas sûr à 100% que le format de sortie soit toujours le même.
la source
conv=notrunc
est nécessaire?gzip -c file | dd of=file
semble fonctionner aussi bien.gzip
) écrit plus d'en-têtes et d'octets de données que les octets de données d'origine, écrasant ainsi certaines parties du fichier? Je suppose que cela dépend du programme de compression choisi. Quelqu'un a-t-il une idée de la façon d'empêcher que cela se produise ou de la probabilité (im) probable de cela?Ce n'est pas tant que ça
gzip
etbzip2
écraser l'original. Au lieu de cela, ils écrivent les données compressées sur le disque en tant que nouveau fichier et si cette opération réussit, ils dissocient le fichier non compressé d'origine.Si vous avez suffisamment de RAM, vous pouvez écrire un script pour compresser temporairement les fichiers dans un
tmpfs
système de fichiers, puis supprimer l'original sur le disque et le remplacer par la version compressée. Peut-être quelque chose comme ça:Gardez simplement à l'esprit votre utilisation de la mémoire, car il
tmpfs
s'agit essentiellement d'un disque RAM. Un fichier de sortie volumineux pourrait facilement affamer le système et causer d'autres problèmes pour vous.la source
Il n'y a aucun outil qui fonctionne de cette façon, précisément pour la raison que vous donnez. Peu de gens sont prêts à écrire un outil qui met délibérément en œuvre des comportements à risque.
la source
Les commandes split et csplit peuvent être utilisées pour diviser le gros fichier en parties plus petites, puis les compresser individuellement. Le remontage serait cependant assez long.
la source