Estimation de la taille d'un fichier compressé à l'aide d'un paramètre de liste

3

Je suis en train de compresser une liste de fichiers d'un répertoire au format suivant:

tar -cvjf test_1.tar.gz -T test_1.lst --no-récursivité

La commande ci-dessus ne compresse que les fichiers mentionnés dans la liste. Je le fais parce que cette liste est générée de manière à correspondre à un DVD. Cependant, pendant la compression, le taux de compression diminue la taille estimée du fichier et il reste beaucoup d’espace libre sur le DVD. Cela ressemble à un algorithme Knapsack.

Je voudrais estimer la taille du fichier compressé et ajouter quelques fichiers supplémentaires à la liste. J'ai trouvé qu'il est possible d'estimer la taille du fichier à l'aide de la commande suivante:

tar -cjf - Dossier / | wc -c

Cette commande ne prend pas de paramètre de liste. Existe-t-il un moyen d'estimer la taille du fichier compressé? Je cherche aussi des options comme les scripts Perl, etc.

Modifier:

Je pense que je devrais fournir plus d'informations car j'ai beaucoup fait de recherches sur le Web. Je suis tombé sur un script Perl ( Link ) qui imite en quelque sorte l'algorithme Knapsack.

Le problème actuel avec le script mentionné ci-dessus est qu'il divise les fichiers dans leur état d'origine. Lorsque je compresse les fichiers après les avoir scindés, il est possible d'ajouter d'autres fichiers que je considère inefficaces.

Il y a deux manières de résoudre l'inefficacité:

a) Compressez les fichiers individuels et enregistrez-les dans un répertoire à l'aide d'un script. Le fichier compressé pourrait fournir une meilleure estimation. Je pourrais générer un script en utilisant un dossier de fichiers compressés et les utiliser sur les fichiers non compressés.

b) Vérifiez si la taille du fichier compressé est inférieure à la taille requise. Si c'est le cas, je devrais continuer à ajouter des fichiers jusqu'à ce que je remplisse cette condition. Cependant, l'ajout de nouveaux fichiers au fichier compressé est un problème d'optimisation en soi.

Sai
la source

Réponses:

1

Edit 2:

J'ai relu votre question et trouvé une nouvelle façon de l'interpréter. Il est simple de trouver la taille d'un fichier après compression, en utilisant quelque chose comme bzip2 -k $file | wc -csur chaque fichier. Cela ne résoudra cependant pas votre problème, car vous n'êtes pas intéressé par la taille de chaque fichier compressé, mais par la taille compressée d'une archive contenant tous vos fichiers (et de son augmentation si vous ajoutez un fichier spécifique). La différence de taille par rapport à la compression n’est pas linéaire mais plutôt imprévisible. L’un est donc un prédicteur médiocre pour le second.

Un exemple est deux fichiers identiques de 10 Mio, où les deux se compressent individuellement à 1 Mio et une archive contenant les deux compresse également à 1 Mio.

Réponse originale

Je crois que la solution commune splitconsiste à diviser simplement les données compressées , ce qui signifie que vous avez besoin de tous les disques résultants disponibles pour pouvoir récupérer un fichier à partir de l'un d'entre eux. Je pense qu’il tarexiste un mécanisme de fractionnement intégré, mais il ne fonctionne que sur la quantité de données non compressées, ce qui donne des résultats médiocres avec la compression et les fichiers non homogènes.

Une solution différente (loin d'être parfaite) fonctionne si vous pouvez avoir une intervention manuelle et pourrait suffire. Cela fonctionne mieux si vos fichiers sont volumineux par rapport à la taille de volume souhaitée.

Je suppose que vous avez une taille de volume cible, en MiB. Dans l'exemple, j'utilise 700 Mio.

Si tu cours

tout="/tmp/09b00c50a9625deeb1089b3c4358c5e5" #or something else
csize="7" # in MiB
mkfifo "$tout"
tar -cvj ~/ 2>"$tout" | dd bs=1M count="$csize" of=/dev/null iflag=fullblock 2>/dev/null &
tail -20 "$tout" | xargs -n 1 ls -ld
rm "$tout"

tarimprimera tous les fichiers qu’il essaie de compresser dans le tuyau, jusqu’à ce que dd ait reçu 700 Mio de données compressées. taillit les 20 derniers fichiers que tarle fifo a tenté de compresser.

Le dernier fichier imprimé (au moins) ne pourra pas tenir dans la taille de votre volume. En raison de la mise en cache dans les deux fichiers taret bzip2, plusieurs des derniers fichiers risquent de ne pas convenir à l'un ou à l'autre, vous devrez donc peut-être expérimenter un peu le nombre de fichiers que vous ignorez. Si tous les fichiers sont très petits, vous devrez peut-être en tailimprimer plus de 20 pour voir celui qui vous dépasse.

Modifier:

Vous pouvez même écrire directement les noms de fichiers dans votre liste de fichiers (avec un filtre approprié pour supprimer les répertoires) et simplement supprimer les dernières lignes dans un éditeur de texte.

Eroen
la source
J'ai fourni quelques informations supplémentaires dans mon édition au message. J'ai hâte d'entendre ce que vous pensez de la même chose
Sai