Παραδείγματα εντολών 15 tar για Sysadmin και προγραμματιστές

Το tar είναι μία από τις δημοφιλείς μορφές αρχειοθέτησης αρχείων που διατίθενται σε συστήματα που βασίζονται σε Unix και Linux.

Το ίδιο το όνομα προέρχεται από το Tape ARchive καθώς αναπτύχθηκε για την εγγραφή διαδοχικών δεδομένων σε συσκευές ταινίας. Μερικές φορές αναφέρεται και ως tarball.

Από προεπιλογή, το tar αρχειοθετεί μόνο τα αρχεία χωρίς συμπίεση αλλά χρησιμοποιώντας ορισμένα τμήματα. Μπορούμε να χρησιμοποιήσουμε διαφορετικές τεχνικές συμπίεσης για να έχουμε μια συμπιεσμένη έξοδο. Το βοηθητικό πρόγραμμα tar περιλαμβάνεται συνήθως στις περισσότερες διανομές Linux από προεπιλογή και η ίδια η μορφή υποστηρίζεται σε άλλα λειτουργικά συστήματα, συμπεριλαμβανομένων των Windows και του macOS, μέσω διαφορετικών εργαλείων και βοηθητικών προγραμμάτων.

Θα καλύψουμε μερικά από τα κοινά παραδείγματα και τη χρήση της εντολής tar και των υποστηριζόμενων σημαιών της σε αυτό το άρθρο.

Ας ξεκινήσουμε λοιπόν…

Δημιουργία αρχείου tar

Για να δημιουργήσετε ένα απλό μη συμπιεσμένο αρχείο, η σύνταξη για την εντολή tar είναι:

$ tar cvf <tar-file-name> <files-to-archive>

Εδώ οι σημαίες c αντιπροσωπεύουν δημιουργία, v για αναλυτική έξοδο και f για καθορισμό του ονόματος αρχείου αρχείου tar. Κατά σύμβαση, καθορίστε το όνομα του αρχείου tar με επέκταση .tar. Τα αρχεία που πρόκειται να αρχειοθετηθούν μπορούν να καθοριστούν με χαρακτήρες μπαλαντέρ ή ως ονόματα/διαδρομές ενός ή πολλαπλών αρχείων.

Για παράδειγμα, έχω τρία αρχεία στον κατάλογό μου:

$ ls -l
total 12
-rw-r--r-- 1 abhisheknair abhisheknair 13 Sep 12 20:08 file1.txt
-rw-r--r-- 1 abhisheknair abhisheknair 19 Sep 12 20:08 file2.txt
-rw-r--r-- 1 abhisheknair abhisheknair 24 Sep 12 20:08 file3.txt
$

Και θέλω να δημιουργήσω ένα αρχείο tar που περιέχει και τα τρία αρχεία, μπορεί να γίνει ως εξής:

$ tar cvf archive.tar *
file1.txt
file2.txt
file3.txt
$ ls -l archive.tar
-rw-r--r-- 1 abhisheknair abhisheknair 10240 Sep 12 20:15 archive.tar
$

Μπορώ επίσης να καθορίσω μόνο συγκεκριμένα αρχεία για αρχειοθέτηση, όπως:

$ tar cvf archive1.tar file1.txt file2.txt
file1.txt
file2.txt
$ ls -l archive1.tar
-rw-r--r-- 1 abhisheknair abhisheknair 10240 Sep 12 20:15 archive1.tar
$

Δημιουργία συμπιεσμένου αρχείου (GZ)

Το tar όχι μόνο επιτρέπει την αρχειοθέτηση αρχείων αλλά και τη συμπίεσή τους για εξοικονόμηση χώρου. Μία από τις δημοφιλείς μορφές συμπίεσης είναι το gunzip, που συνήθως αντιπροσωπεύεται από την επέκταση .gz μετά το .tar ή ως tgz. Μπορούμε να χρησιμοποιήσουμε τη σημαία z για να καθορίσουμε ότι χρειαζόμαστε συμπίεση των αρχείων χρησιμοποιώντας gunzip. Εδώ είναι ένα παράδειγμα:

$ tar cvzf archive.tar.gz file*
file1.txt
file2.txt
file3.txt
$ ls -l archive.tar archive.tar.gz
-rw-r--r-- 1 abhisheknair abhisheknair 10240 Sep 12 20:15 archive.tar
-rw-r--r-- 1 abhisheknair abhisheknair   188 Sep 12 20:21 archive.tar.gz
$

Μπορείτε να παρατηρήσετε ότι το μέγεθος και των δύο αρχείων αρχειοθέτησης είναι ουσιαστικά διαφορετικό, παρόλο που και τα δύο περιέχουν τα ίδια τρία αρχεία. Αυτό οφείλεται στη χρήση συμπίεσης χρησιμοποιώντας z flag.

  14 Εργαλεία ενορχήστρωσης κοντέινερ για DevOps

Δημιουργία συμπιεσμένου αρχείου (BZ2)

Το tar υποστηρίζει πολλές άλλες μορφές συμπίεσης. Ένα από αυτά είναι το bz2 ή bzip2 που αντιπροσωπεύεται από την επέκταση tar.bz2 ή μερικές φορές ως tbz2. Μπορεί να σας δώσει μικρότερο μέγεθος αρχείου, αλλά με τη σειρά του καταναλώνει περισσότερη CPU, επομένως η διαδικασία συμπίεσης/αποσυμπίεσης θα μπορούσε να είναι πιο αργή από το αρχείο gz.

Παράδειγμα:

$ tar cvjf archive.tar.bz2 file*
file1.txt
file2.txt
file3.txt
$ ls -l archive.tar archive.tar.gz archive.tar.bz2
-rw-r--r-- 1 abhisheknair abhisheknair 10240 Sep 12 20:15 archive.tar
-rw-r--r-- 1 abhisheknair abhisheknair   212 Sep 12 20:25 archive.tar.bz2
-rw-r--r-- 1 abhisheknair abhisheknair   188 Sep 12 20:21 archive.tar.gz
$ file archive.tar*
archive.tar:     POSIX tar archive (GNU)
archive.tar.bz2: bzip2 compressed data, block size = 900k
archive.tar.gz:  gzip compressed data, from Unix, original size modulo 2^32 10240
$

Ξεχωρίστε όλα τα αρχεία

Ένα αρχείο tar (είτε συμπιεσμένο είτε μη συμπιεσμένο) μπορεί να εξαχθεί απλά χρησιμοποιώντας την επιλογή x. Τα παρακάτω παραδείγματα θα διευκρινίσουν τη χρήση του:

$ tar xvf archive.tar
file1.txt
file2.txt
file3.txt
$ ls -l
total 24
-rw-r--r-- 1 abhisheknair abhisheknair 10240 Sep 19 18:25 archive.tar
-rw-r--r-- 1 abhisheknair abhisheknair    13 Sep 12 20:08 file1.txt
-rw-r--r-- 1 abhisheknair abhisheknair    19 Sep 12 20:08 file2.txt
-rw-r--r-- 1 abhisheknair abhisheknair    24 Sep 12 20:08 file3.txt
$

Αυτό λειτουργεί για ένα συμπιεσμένο αρχείο gz ως:

$ tar xvf archive.tar.gz
file1.txt
file2.txt
file3.txt
$ ls -l
total 16
-rw-r--r-- 1 abhisheknair abhisheknair 188 Sep 19 18:27 archive.tar.gz
-rw-r--r-- 1 abhisheknair abhisheknair  13 Sep 12 20:08 file1.txt
-rw-r--r-- 1 abhisheknair abhisheknair  19 Sep 12 20:08 file2.txt
-rw-r--r-- 1 abhisheknair abhisheknair  24 Sep 12 20:08 file3.txt
$

Ή ακόμα και για ένα συμπιεσμένο αρχείο bz2 ως:

$ tar xvf archive.tar.bz2
file1.txt
file2.txt
file3.txt
$ ls -l
total 16
-rw-r--r-- 1 abhisheknair abhisheknair 212 Sep 19 18:31 archive.tar.bz2
-rw-r--r-- 1 abhisheknair abhisheknair  13 Sep 12 20:08 file1.txt
-rw-r--r-- 1 abhisheknair abhisheknair  19 Sep 12 20:08 file2.txt
-rw-r--r-- 1 abhisheknair abhisheknair  24 Sep 12 20:08 file3.txt
$

Λίστα περιεχομένων πίσσας

Για να παραθέσετε τα περιεχόμενα ενός αρχείου tar, μπορείτε να χρησιμοποιήσετε τη σημαία t όπως φαίνεται παρακάτω:

$ tar tvf archive.tar.bz2
-rw-r--r-- abhisheknair/abhisheknair 13 2021-09-12 20:08 file1.txt
-rw-r--r-- abhisheknair/abhisheknair 19 2021-09-12 20:08 file2.txt
-rw-r--r-- abhisheknair/abhisheknair 24 2021-09-12 20:08 file3.txt
$

Untar Specific Files

Μόνο ένα αρχείο μπορεί να εξαχθεί από ένα αρχείο tar ή tar.gz ή tar.bz2 καθορίζοντας το όνομα αρχείου ως:

$ tar xvf archive.tar.bz2 file1.txt
file1.txt
$ ls -l
total 8
-rw-r--r-- 1 abhisheknair abhisheknair 212 Sep 19 18:31 archive.tar.bz2
-rw-r--r-- 1 abhisheknair abhisheknair  13 Sep 12 20:08 file1.txt
$

Ομοίως, μπορείτε να καθορίσετε πολλά ονόματα αρχείων χωρισμένα με κενό για να τα εξαγάγετε μαζί με μία κίνηση.

$ tar xvf archive.tar.bz2 file1.txt file3.txt
file1.txt
file3.txt
$ ls -l
total 12
-rw-r--r-- 1 abhisheknair abhisheknair 212 Sep 19 18:31 archive.tar.bz2
-rw-r--r-- 1 abhisheknair abhisheknair  13 Sep 12 20:08 file1.txt
-rw-r--r-- 1 abhisheknair abhisheknair  24 Sep 12 20:08 file3.txt
$

Untar χρησιμοποιώντας Wildcard

Για να εξαγάγετε ένα ή περισσότερα αρχεία χρησιμοποιώντας ένα PATTERN μπαλαντέρ, χρησιμοποιήστε τη σημαία –μπαλαντέρ:

$ tar xvf archive.tar.bz2 --wildcards "file*"
file1.txt
file2.txt
file3.txt
$ ls -l
total 16
-rw-r--r-- 1 abhisheknair abhisheknair 212 Sep 19 18:31 archive.tar.bz2
-rw-r--r-- 1 abhisheknair abhisheknair  13 Sep 12 20:08 file1.txt
-rw-r--r-- 1 abhisheknair abhisheknair  19 Sep 12 20:08 file2.txt
-rw-r--r-- 1 abhisheknair abhisheknair  24 Sep 12 20:08 file3.txt
$

Προσθήκη αρχείων στο Αρχείο

Μπορούν να προστεθούν/προσαρτηθούν νέα αρχεία σε υπάρχοντα μη συμπιεσμένα tarball χρησιμοποιώντας τη σημαία r ή –append με νέα ονόματα αρχείων ή μοτίβο μπαλαντέρ (θυμηθείτε ότι αυτό λειτουργεί μόνο με μη συμπιεσμένα αρχεία .tar και όχι με συμπιεσμένες μορφές tar.gz ή tar.bz2):

$ tar rvf archive.tar file-new*
file-new.txt
file-new2.txt
$ tar tvf archive.tar
-rw-r--r-- abhisheknair/abhisheknair 13 2021-09-12 20:08 file1.txt
-rw-r--r-- abhisheknair/abhisheknair 19 2021-09-12 20:08 file2.txt
-rw-r--r-- abhisheknair/abhisheknair 24 2021-09-12 20:08 file3.txt
-rw-r--r-- abhisheknair/abhisheknair 15 2021-09-19 18:59 file2.txt
-rw-r--r-- abhisheknair/abhisheknair 10 2021-09-19 18:58 file4.txt
-rw-r--r-- abhisheknair/abhisheknair  9 2021-09-19 19:10 file-new.txt
-rw-r--r-- abhisheknair/abhisheknair  9 2021-09-19 19:10 file-new2.txt
$

Μπορείτε να παρατηρήσετε ότι η λίστα των περιεχομένων του archive.tar εμφανίζει ξανά τα δύο αρχεία που προστέθηκαν πρόσφατα.

  Πώς να χρησιμοποιήσετε Κυμαινόμενες Εφαρμογές (Slide Over) σε ένα iPad

Διαγραφή αρχείων από το Αρχείο

Η κατάργηση συγκεκριμένων αρχείων από ένα αρχείο tar είναι δυνατή χρησιμοποιώντας τη σημαία –delete όπως φαίνεται παρακάτω (συγκρίνετε τη λίστα tar πριν και μετά τη διαγραφή αρχείων):

$ tar tvf archive.tar
-rw-r--r-- abhisheknair/abhisheknair 13 2021-09-12 20:08 file1.txt
-rw-r--r-- abhisheknair/abhisheknair 19 2021-09-12 20:08 file2.txt
-rw-r--r-- abhisheknair/abhisheknair 24 2021-09-12 20:08 file3.txt
-rw-r--r-- abhisheknair/abhisheknair 15 2021-09-19 18:59 file2.txt
-rw-r--r-- abhisheknair/abhisheknair 10 2021-09-19 18:58 file4.txt
-rw-r--r-- abhisheknair/abhisheknair  9 2021-09-19 19:10 file-new.txt
-rw-r--r-- abhisheknair/abhisheknair  9 2021-09-19 19:10 file-new2.txt
$ tar --delete -f archive.tar file-new.txt file-new2.txt
$ tar tvf archive.tar
-rw-r--r-- abhisheknair/abhisheknair 13 2021-09-12 20:08 file1.txt
-rw-r--r-- abhisheknair/abhisheknair 19 2021-09-12 20:08 file2.txt
-rw-r--r-- abhisheknair/abhisheknair 24 2021-09-12 20:08 file3.txt
-rw-r--r-- abhisheknair/abhisheknair 15 2021-09-19 18:59 file2.txt
-rw-r--r-- abhisheknair/abhisheknair 10 2021-09-19 18:58 file4.txt
$

Και πάλι αυτό λειτουργεί μόνο για μη συμπιεσμένα tarball και θα αποτύχει για συμπιεσμένες μορφές αρχειοθέτησης.

Δημιουργία με το Verify

Κατά τη δημιουργία μη συμπιεσμένων αρχείων tar, μπορείτε να επαληθεύσετε τα περιεχόμενα του αρχείου χρησιμοποιώντας τη σημαία W ως:

$ tar cvfW archive.tar file*.txt
file1.txt
file2.txt
file3.txt
Verify file1.txt
Verify file2.txt
Verify file3.txt
$

Αυτό δεν μπορεί να χρησιμοποιηθεί με σημαίες συμπίεσης, αν και μπορείτε να συμπιέσετε το δημιουργημένο αρχείο tar αργότερα χρησιμοποιώντας gzip ή άλλα εργαλεία.

Εξαγωγή πίσσας στο φάκελο

Εάν θέλετε να εξαγάγετε τα περιεχόμενα του tarball σε έναν συγκεκριμένο φάκελο αντί για τον τρέχοντα κατάλογο, χρησιμοποιήστε τη σημαία -C με τη διαδρομή καταλόγου όπως φαίνεται παρακάτω:

$ tar xvf archive.tar -C new-directory/
file1.txt
file2.txt
file3.txt
file2.txt
file4.txt
$ ls -l new-directory/
total 16
-rw-r--r-- 1 abhisheknair abhisheknair 13 Sep 12 20:08 file1.txt
-rw-r--r-- 1 abhisheknair abhisheknair 15 Sep 19 18:59 file2.txt
-rw-r--r-- 1 abhisheknair abhisheknair 24 Sep 12 20:08 file3.txt
-rw-r--r-- 1 abhisheknair abhisheknair 10 Sep 19 18:58 file4.txt
$

Χρησιμοποιήστε τη σημαία διαφορά

Μπορείτε να χρησιμοποιήσετε τη σημαία –diff ή d για να βρείτε τυχόν αλλαγές μεταξύ των αρχείων στο αρχείο tar και εκείνων στο σύστημα αρχείων. Ακολουθεί ένα παράδειγμα που εκτελεί τη διαφορά μία φορά όταν το αρχείο μέσα στο tar και έξω ήταν το ίδιο. Μετά την ενημέρωση του αρχείου, εκτελέστηκε ξανά για να δείξει τη διαφορά στην έξοδο.

$ tar dvf archive.tar file4.txt
file4.txt
$
$ echo newline > file4.txt
$
$ tar dvf archive.tar file4.txt
file4.txt
file4.txt: Mod time differs
file4.txt: Size differs
$

Εξαίρεση αρχείων

Η εξαίρεση συγκεκριμένων αρχείων μπορεί να είναι μια απαίτηση κατά τη δημιουργία αρχείων tar. Αυτό μπορεί να επιτευχθεί με τη σημαία –εξαίρεση.

$ tar --exclude="dir/file2.txt" --exclude="dir/file-new*.txt" -cvzf archive.tar.gz dir/
dir/
dir/file1.txt
dir/file3.txt
$ ls -l dir
total 24
-rw-r--r-- 1 abhisheknair abhisheknair 9 Sep 19 19:10 file-new.txt
-rw-r--r-- 1 abhisheknair abhisheknair 9 Sep 19 19:10 file-new2.txt
-rw-r--r-- 1 abhisheknair abhisheknair 5 Sep 19 19:20 file-new3.txt
-rw-r--r-- 1 abhisheknair abhisheknair 5 Sep 19 19:27 file1.txt
-rw-r--r-- 1 abhisheknair abhisheknair 6 Sep 19 19:27 file2.txt
-rw-r--r-- 1 abhisheknair abhisheknair 8 Sep 19 19:27 file3.txt
$ tar tvf archive.tar.gz
drwxr-xr-x abhisheknair/abhisheknair 0 2021-09-19 19:30 dir/
-rw-r--r-- abhisheknair/abhisheknair 5 2021-09-19 19:27 dir/file1.txt
-rw-r--r-- abhisheknair/abhisheknair 8 2021-09-19 19:27 dir/file3.txt
$

Όπως μπορείτε να σημειώσετε από την παραπάνω έξοδο, μπορούμε να καθορίσουμε τη σημαία –exclude πολλές φορές για να καθορίσουμε πολλά ονόματα αρχείων ή μοτίβα στη συνθήκη AND. Σημειώστε ότι από τα έξι αρχεία στο dir στο παραπάνω παράδειγμα, μόνο δύο αρχεία πληρούσαν την προϋπόθεση να συμπεριληφθούν στο archive.at.gz.

  6 καλύτερες πλατφόρμες συναλλαγών κρυπτογράφησης για αγορά Bitcoin στην Ινδία

Προβολή μεγέθους περιεχομένου πίσσας

Μπορούμε να πάρουμε το μέγεθος των περιεχομένων ενός συμπιεσμένου αρχείου tar χρησιμοποιώντας την παρακάτω εντολή:

$ tar tvf archive.tar.gz
-rw-r--r-- abhisheknair/abhisheknair 13 2021-09-12 20:08 file1.txt
-rw-r--r-- abhisheknair/abhisheknair 19 2021-09-12 20:08 file2.txt
-rw-r--r-- abhisheknair/abhisheknair 24 2021-09-12 20:08 file3.txt
$ tar -xzf archive.tar.gz --to-stdout|wc -c
56
$

Ομοίως για το αρχείο bz2:

$ tar tvf archive.tar.bz2
-rw-r--r-- abhisheknair/abhisheknair 13 2021-09-12 20:08 file1.txt
-rw-r--r-- abhisheknair/abhisheknair 19 2021-09-12 20:08 file2.txt
-rw-r--r-- abhisheknair/abhisheknair 24 2021-09-12 20:08 file3.txt
$ tar -xjf archive.tar.bz2 --to-stdout|wc -c
56
$

Διατήρηση δικαιωμάτων

Από προεπιλογή, η εντολή tar διατηρεί τα δικαιώματα των αρχείων και των καταλόγων που αρχειοθετεί, αν και μπορείτε να καθορίσετε ρητά τα ίδια χρησιμοποιώντας -p flag ή -preserve- δικαιώματα όπως φαίνεται παρακάτω:

$ tar cvpzf archive.tar.gz *.txt
file1.txt
file2.txt
file3.txt
$

Περίληψη 👨‍💻

Το tar είναι ένα χρήσιμο βοηθητικό πρόγραμμα σε συστήματα Unix/Linux για μεγάλο χρονικό διάστημα και χρησιμοποιήθηκε κυρίως σε εργασίες αρχειοθέτησης και δημιουργίας αντιγράφων ασφαλείας. Το βοηθητικό πρόγραμμα έχει εξελιχθεί με πολλές επιλογές με την πάροδο του χρόνου. Μπορεί να χρησιμοποιηθεί για απλές έως πολύπλοκες εργασίες, δεδομένου ότι γνωρίζετε τις δυνατότητες που προσφέρει. Αυτό το άρθρο κάλυψε μερικές από τις βασικές λειτουργίες που μπορείτε να κάνετε με την εντολή tar και παρουσιάζει πώς μπορεί να σας βοηθήσει στις καθημερινές εργασίες διαχείρισης του συστήματος.

Ανατρέξτε στο man page man tar ή χρησιμοποιήστε την εντολή tar –help ή tar –usage για περισσότερες λεπτομέρειες.