8.2.2 Ταίριασμα χαρακτήρων

Σχεδόν κάθε κέλυφος αναγνωρίζει μερικούς χαρακτήρες ως υποκατάστατα ή συντομογραφίες που σημαίνουν πως οτιδήποτε μπορεί να έρθει εδώ. Τέτοιοι χαρακτήρες εύστοχα ονομάζονται wildcards. Οι πιο συνηθισμένοι είναι το * και το ?. Κατά σύμβαση, το ? συνήθως ταιριάζει έναν μοναδικό χαρακτήρα. Για παράδειγμα, ας υποθέσουμε ότι βρίσκεστε σε έναν κατάλογο με τρία αρχεία: ex1.txt, ex2.txt και ex3.txt. Θέλετε να αντιγράψετε όλα αυτά τα αρχεία (χρησιμοποιώντας την εντολή cp που καλύπτουμε στην ενότητα 10.5.1) σε έναν άλλο κατάλογο, ας πούμε τον /tmp. Λοιπόν, το να πληκτρολογήσετε cp ex1.txt ex2.txt ex3.txt /tmp είναι υπερβολικά πολλή δουλειά. Είναι πολύ ευκολότερο να πληκτρολογήσετε cp ex?.txt /tmp. Το ? θα ταιριάξει με κάθε έναν από τους χαρακτήρες “1”, “2” και “3”, και θα αντικατασταθεί για καθέναν από αυτούς.

Τι λέτε; Ακόμα και αυτό είναι πολλή δουλειά; Σωστά. Είναι αποκρουστικό. Έχουμε εργασιακούς νόμους να μας προστατεύουν από τέτοια πράγματα. Ευτυχώς έχουμε και το *. Όπως ήδη αναφέραμε το * ταιριάζει με οποιονδήποτε αριθμό χαρακτήρων, συμπεριλαμβανομένου του 9. Άρα αν υπάρχουν τρία αρχεία και είναι τα μόνα σε έναν κατάλογο, θα μπορούσαμε απλά να έχουμε πει cp * /tmp και να τα μαζεύαμε όλα μαζί. Ας υποθέσουμε, ωστόσο, ότι υπάρχει και ένα αρχείο που λέγεται ex.txt και ένα που λέγεται hejaz.txt. Θέλουμε να αντιγράψουμε το ex.txt αλλά όχι το hejaz.txt. Η cp ex* /tmp θα κάνει αυτό για εμάς.

Η cp ex?.txt /tmp θα συμπεριλάμβανε, φυσικά, μόνο τα τρία αρχικά αρχεία μας. Δεν υπάρχει χαρακτήρας στο ex.txt για να ταιριάξει με το ?, άρα θα έμενε έξω.

Μια ακόμη συνηθισμένη wildcard είναι το ζεύγος αγκυλών []. Οποιοιδήποτε χαρακτήρες στις αγκύλες θα αντικατασταθούν στη θέση του [] για να βρεθούν ταιριάσματα. Ακούγεται περίπλοκο; Δεν είναι τόσο άσχημο. Ας υποθέσουμε για παράδειγμα ότι έχουμε έναν κατάλογο που περιλαμβάνει τα εξής 8 αρχεία: a1, a2, a3, a4, aA, aB, aC και aD. Θέλουμε να βρούμε μόνο τα αρχεία που τελειώνουν με αριθμούς. Η [] θα το κάνει αυτό.

% ls a[1-4]
a1 a2 a3 a4

Αλλά τι γίνεται αν θέλουμε μόνο τα a1, a2, a4; Στο προηγούμενο παράδειγμα χρησιμοποιήσαμε το – εννοώντας όλες τις τιμές από 1 έως 4. Μπορούμε επίσης να χωρίσουμε μεμονωμένες τιμές με κόμματα.

% ls a[1,2,4]
a1 a2 a4

Ξέρω τι σκέφτεστε τώρα, “τι γίνεται με τα γράμματα;”. Το Linux είναι ευαίσθητο στα κεφαλαία και τα πεζά (case sensitive) που σημαίνει ότι το a και το A είναι διαφορετικοί χαρακτήρες και σχετίζονται μόνο στο μυαλό σας. Τα κεφαλαία πάντα είναι μπροστά από τα μικρά, άρα τα A και B είναι πριν τα a και b. Συνεχίζοντας το προηγούμενο παράδειγμα, αν θα θέλαμε τα αρχεία a1 και A1 θα μπορούσαμε να τα βρούμε γρήγορα με [].

% ls [A,a]1
A1 a1

Σημειώστε ότι αν περιλαμβάναμε παύλα αντί για κόμμα θα παίρναμε λάθος αποτελέσματα.

% ls [A-a]1
A1 B1 C1 D1 a1

Μπορείτε επίσης να συνδυάσετε συμβολοσειρές με παύλες και κόμματα.

% ls [A,a-d]
A1 a1 b1 c1 d1