Συμπίεση αρχείων

Εικόνα: markos
Submitted by markos on Δευ, 05/03/2007 - 00:14

Η συμπίεση αρχείων είναι κάτι αρκετά διαδεδομένο σε όλα τα λειτουργικά. Ο τρόπος με τον οποίο συμπιέζεται ένα αρχείο, το πρωτόκολλο συμπίεσης όπως πιο σωστά καλείται, συνήθως είναι συμφυής με το λειτουργικό σύστημα για το οποίο προορίζεται η χρήση του αρχείου. Έτσι για τα Windows έχει πλέον εδραιωθεί η χρήση του πρωτοκόλλου ZIP (με δευτερεύοντα πρωτόκολλα όπως RAR, ACE, κλπ), ενώ στο UNIX και κατά συνέπεια και στο Linux, απαντώνται δύο κύρια πρωτόκολλα συμπίεσης τα οποία χρησιμοποιούνται από τις δύο εντολές που αναφέρουμε παρακάτω.

Η εντολή GNU zip (gzip)

Η εντολή gzip χρησιμοποιεί μια τεχνική κωδικοποίησης βασισμένη στο αλγόριθμό Lempel-Ziv. Τα συμπιεσμένα αρχεία αναγνωρίζονται με την κατάληξη .gz στο όνομά τους. Τη gzip συμπληρώνουν και ένα πλήθος άλλων εντολών, όπως gunzip, uncompress, και zcat. Στην ουσία πρόκειται για σθεναρούς συνδέσμους στην ίδια εντολή gzip, η οποία προσαρμόζει τη λειτουργία της αναλόγως τον τρόπο κλήσης της. Ως gunzip ή uncompress αποσυμπιέζει επί τόπου τα συμπιεσμένα αρχεία, ενώ ως zcat αποσυμπιέζει και τυπώνει στην πρότυπη έξοδο (ακριβώς όπως η εντολή cat) τα περιεχόμενά τους. Η εντολή gzip αναγνωρίζει και αρχεία που έχουν συμπιεστεί με την παλαιότερη εντολή του UNIX, compress, και έχουν την κατάληξη .Z.

Η σύνταξη των εντολών είναι η εξής:

gzip [options] file...
gunzip [options] file...
uncompress [options] file...
zcat [options] file...

Ορισμένες από τις επιλογές που δέχονται αναγράφονται στον επόμενο πίνακα:

Επιλογές
Λειτουργία
-c
--stdout
--to-stdout
Συμπιέζει (ή αποσυμπιέζει) και τυπώνει το αποτέλεσμα στην πρότυπη έξοδο. Χρήσιμο σε συνδυασμό με ανακατεύθυνση. Η zcat ορίζεται ως uncompress -c.
-d
--decompress
--uncompress
Αποσυμπιέζει τα αρχεία που δίνονται ως παράμετροι.
-l
--list
Για κάθε αρχείο που δίνεται ως παράμετρος, εμφανίζονται οι εξής πληροφορίες:
compressed size: Μέγεθος του συμπιεσμένου αρχέιου
uncompressed size: αρχικό μέγεθος
ratio: λόγος συμπίεσης
uncompressed_name: όνομα αποσυμπιεσμένου αρχείου
-r
--recursive
Πραγματοποιεί αναδρομικά στους περιεχόμενους καταλόγους την πράξη της συμπίεσης/αποσυμπίεσης.
-S .suf
--suffix .suf
Χρησιμοποιεί ως κατάληξη το .suf.
-t
--test
Ελέγχει την ακεραιότητα του αρχείου. Σε συνδυασμό με τη -v, τυπώνει OK μετά το όνομα του αρχείου αν τα δεδομένα του είναι ακέραια.
-v --verbose Εμφανίζει επιπλέον πληροφορίες για την διαδικασία της συμπίεσης.
-#
--fast
--best
Ορίζει το επίπεδο ποιότητας της συμπίεσης. Η επιλογή -1 ή ισοδύναμα --fast δίνει μεγαλύτερη έμφαση στη μείωση του χρόνου συμπίεσης, ενώ η -9 (ισοδύναμα --best) προσπαθεί να επιτύχει μεγαλύτερο λόγο συμπίεσης. Το προκαθορισμένο επίπεδο συμπίεσης είναι -6.

Αντίστοιχα προσφέρονται και εντολές που αποσυμπιέζουν ένα αρχείο και στέλνουν τα (αποσυμπιεσμένα) περιεχόμενά του σε άλλες εντολές, όπως zless, zmore, zgrep, zdiff, zcmp, κλπ. Ακολουθούν ορισμένα παραδείγματα της χρήσης της gzip και των βοηθητικών εντολών της.

Για να συμπιέσουμε δύο αρχεία file1 και file2 με ανάλυση της διαδικασίας

$ gzip -v file1 file2
file1:   91.6% -- replaced with file1.gz
file2:   66.1% -- replaced with file2.gz

Αν το αρχείο file1 ήταν αρχείο κειμένου μπορούμε πολύ εύκολα να το δούμε με τις εξής ισοδύναμες εντολές:

$ zless file1.gz
$ zcat file1.gz |less
$ gunzip -c file1.gz |less
$ gzip -dc file1.gz |less

Η zless ειδικά είναι πολύ χρήσιμη για να δούμε τα αρχεία κείμενων που συνοδεύουν τα πακέτα λογισμικού του Debian, που συνήθως είναι συμπιεσμένα:

$ zless /usr/share/doc/gzip/changelog.Debian.gz

Ενώ μπορούμε να αναζητήσουμε κείμενο μέσα στο αρχείο χωρίς να το αποσυμπιέσουμε:

$ zgrep -i “Prices” file1.gz

Η ίδια η gzip με την επιλογή -l μας δίνει πληροφορίες για τα συμπιεσμένα αρχεία, ενώ με τις -lv οι πληροφορίες είναι πιο αναλυτικές.

$ gzip -l file1 file2
         compressed        uncompressed  ratio uncompressed_name
               1782               20845  91.6% file1
                600                1700  66.1% file2
               2382               22545  89.5% (totals)
$ gzip -lv file1 file2
method  crc     date  time           compressed        uncompressed  ratio uncompressed_name
defla 829009df Jul  8 13:18                1782               20845  91.6% file1
defla 6f54f29f Jul  8 13:18                 600                1700  66.1% file2
                                           2382               22545  89.5% (totals)

Η εντολή bzip2

Η εντολή bzip2 βασίζεται σε μια διαφορετική τεχνική συμπίεσης, τον αλγόριθμο ταξινόμησης block κειμένου Burrows-Wheeler που σε πολλές περιπτώσεις παρέχει καλύτερους λόγους συμπίεσης από τον αλγόριθμο Lempel-Ziv. Τα αρχεία που είναι συμπιεσμένα με αυτήν την εντολή έχουν συνήθως την κατάληξη .bz2.
Η σύνταξή της εντολής είναι παρόμοια με της gzip ενώ οι επιλογές της είναι σχεδόν ίδιες με αυτές της gzip.

bzip2 [options] file...
bunzip2 [options] file...
bzcat [options] file...
bzip2recover filename

Παρέχονται και εδώ οι αντίστοιχες βοηθητικές εντολές bzless, bzmore, bzgrep, bzdiff, bzcmp, κλπ.

Η bzip2recover είναι μια εντολή ανάκτησης δεδομένων από ένα κατεστραμμένο αρχείο .bz2, αν φυσικά κάτι τέτοιο είναι δυνατόν. Ωστόσο συμβαίνει κάποιες φορές ένα αρχείο να είναι κατεστραμμένο σε μόνο μερικά σημεία, και αυτό ακριβώς προσπαθεί να εκμεταλλευτεί η bzip2recover για να ανακτήσει τα υπόλοιπα τμήματα του αρχείου τα οποία είναι άθικτα.

Άλλες εντολές συμπίεσης

Σε περίπτωση που χρειαστείτε να αποσυμπιέσετε άλλων ειδών αρχεία, το Debian προσφέρει εργαλεία για τα περισσότερα διαθέσιμα πρωτόκολλα συμπίεσης. Αναφορικά, παραθέτουμε τον ακόλουθο πίνακα:

Κατάληξη Αρχείου Πακέτα στο Debian
.zip zip, unzip
.rar rar, unrar
.lha lha
.arj arj, unarj
.zoo zoo, unzoo

0
Your rating: None