Αναζήτηση αρχείων

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

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

Η εντολή find

Η εντολή find είναι ίσως το πιο δυνατό εργαλείο για αναζήτηση αρχείων. Η αναζήτηση μέσω της find μπορεί να γίνει χρησιμοποιώντας πολλά κριτήρια ακόμη και σε συνδυασμό. Ενδεικτικά αναφέρουμε ορισμένα από τα κριτήρια αναζήτησης:

  • Αναζήτηση με το χρόνο προσπέλασης του αρχείου.
  • Αναζήτηση με το χρόνο τροποποίησης του αρχείου.
  • Αναζήτηση με το όνομα του ιδιοκτήτη ή της ομάδας του αρχείου.
  • Αναζήτηση με τις άδειες προσπέλασης του αρχείου.
  • Αναζήτηση με τον τύπο του αρχείου.
  • Αναζήτηση με τη σχετική ηλικία του αρχείου ως προς κάποιο άλλο αρχείο.
  • Αναζήτηση με το μέγεθος του αρχείου.
  • Αναζήτηση με το όνομα ή με κάποια κανονική παράσταση (regular expression) χρησιμοποιώντας μεταχαρακτήρες.

Η σύνταξή της find είναι η εξής:

find directory OPTIONS ACTION

όπου directory είναι το σημείο εκκίνησης της αναζήτησης, δηλαδή ο κατάλογος από τον οποίο θα ξεκινήσει την αναζήτηση η find. Ορισμένες από τις επιλογές που δέχεται η find αναγράφονται στον επόμενο πίνακα:

Επιλογές
Λειτουργία
-amin N
-atime N
Αναζήτηση με το χρόνο προσπέλασης του αρχείου, όπου N ο αριθμός των λεπτών (για την amin) ή των ημερών (για την atime) από την τελευταία προσπέλαση. Με τη χρήση των τελεστών +, - μπορούμε να ζητήσουμε τα αρχεία που προσπελάστηκαν πριν από χρόνο μεγαλύτερο (+) ή μικρότερο (-) από N λεπτά/ημέρες.
-cmin N
-ctime N
Παρόμοια λειτουργία με τις amin, atime αλλά για το χρόνο από την τελευταία τροποποίηση.
-follow Αφορά τους συμβολικούς συνδέσμους αρχείων. Η διαδικασία της αναζήτησης θα εφαρμοστεί στο πραγματικό αρχείο και όχι στο σύνδεσμό του.
-group gname Αναζήτηση με το όνομα της ομάδας χρηστών gname.
-user uname Αναζήτηση με το όνομα χρήστη uname.
-mindepth
-maxdepth
Ελάχιστο και μέγιστο βάθος διαδρομής καταλόγου στο οποίο θα πραγματοποιηθεί η αναζήτηση. Δηλαδή, καθορίζει το βάθος του δέντρου αρχείων στο οποίων θα αναζητήσει αρχεία η find.
-name expr Αναζήτηση με το όνομα ή την κανονική παράσταση expr.
-newer file Αναζήτηση νεώτερων αρχείων από το file.
-perm protbits Αναζήτηση αρχείων που έχουν τις άδειες προσέλασης που δίνονται (protbits) σε οκταδική (απόλυτη) μορφή.
-size N[bckw] Αναζήτηση με το μέγεθος. Αναγνωρίζονται οι εξής μονάδες μεγέθους: 512-byte block ('b'), bytes ('c'), kilobytes ('k'), 2-byte words ('w'). Ισχύουν και εδώ οι τελεστές +, - ζητώντας αντίστοιχα μεγαλύτερα ή μικρότερα μεγέθη αρχείων.
-type T Αναζήτηση με τον τύπο του αρχείου, όπου T μπορεί να είναι ένα από τα εξής: ειδικό αρχείο block ('b'), ειδικό αρχείο χαρακτήρα ('c'), κατάλογος ('d'), ονομαστικός δίαυλος (FIFO) ('p'), κοινό αρχείο ('f'), συμβολικός σύνδεσμος ('l'), υποδοχέας (socket) ('s').

Ως δράση (ACTION) μπορούμε να έχουμε μία από τις εξής:

Παράμετρος
Λειτουργία
-exec cmd Εκτελεί την εντολή cmd για κάθε αρχείο που βρίσκει. Το όνομα του εκάστοτε αρχείου συμβολίζεται με τα άγκιστρα {}.
-ok cmd Το ίδιο, αλλά με ερώτηση επιβεβαίωσης πριν από την εκτέλεση της εντολής.
-print Επιστρέφει το όνομα του αρχείου που βρέθηκε.
-ls Επιστρέφει το αποτέλεσμα της εντολής ls -dils για κάθε αρχείο που βρέθηκε.

Παραδείγματα:

$ find /usr/include -name “v*.h” -print

Αναζήτηση όλων των αρχείων κεφαλίδας (include files) που βρίσκονται στον κατάλογο /usr/include και των οποίων το όνομα αρχίζει από v.

$ find / -name core -exec rm -f “{}” \;

Αναζήτηση όλων των αποτυπωμάτων μνήμης (core dumps) που βρίσκονται στο σύστημα και άνευ όρων διαγραφή τους. Το \ στο ; είναι απαραίτητο ώστε να μην θεωρηθεί τέλος εντολής από το κέλυφος, αλλά τέλος της εντολής που περνάμε ως παράμετρο στην -exec.

$ find backup -size +100k -exec mv '{}' BigFiles \;

Αναζήτηση των αρχείων του καταλόγου backup που έχουν μέγεθος μεγαλύτερο από 100 kilobytes και μετακίνησή τους στον κατάλογο BigFiles.

$ find $HOME \! -user `whoami` -type d -ok rm '{}' \;

Αναζήτηση όλων των αρχείων του καταλόγου $HOME του τρέχοντος χρήστη (προσέξατε τις δασείες στη whoami) και διαλογική διαγραφή τους.

Περισσότερα παραδείγματα και πληροφορίες για τη find, μπορείτε να βρείτε στις σελίδες οδηγιών (man find) ή στα κείμενα πληροφοριών (info find).

Η εντολή locate

Η εντολή locate είναι ένας αρκετά πιο εύκολος και γρήγορος τρόπος για να βρείτε κάποια αρχεία με βάση το όνομά τους. Δεν προσφέρει όλες τις δυνατότητες της find αλλά είναι πολύ πιο γρήγορη, καθώς χρησιμοποιεί το ευρετήριο αρχείων που δημιουργεί η εντολή updatedb. Στην πραγματικότητα, η locate δεν αναζητά αρχεία τα ζητούμενα αρχεία στο σύστημα αρχείων, αλλά τα ονόματα τους σε ένα ευρετήριο αρχείων που ανανεώνεται σε τακτά χρονικά διαστήματα. Αυτό σημαίνει ότι υπάρχει περίπτωση να μην βρίσκει κάποιο νεώτερο αρχείο αν δεν έχει ανανεωθεί το ευρετήριο.

Η σύνταξή της είναι αρκετά απλή:

locate [OPTIONS] pattern

όπου pattern η κανονική παράσταση των ζητούμενων ονομάτων, ενώ μερικές από τις σημαντικότερες επιλογές φαίνονται στον επόμενο πίνακα:

Επιλογές
Λειτουργία
-e
--existing
Επιστρέφει μόνο τα αρχεία που υπάρχουν πραγματικά στο σύστημα, και όχι όλα όσα υπάρχουν στο ευρετήριο. Αυτό μπορεί να καθυστερήσει την εκτέλεση της εντολής αισθητά.
-i
--ignore-case
Να αγνοηθούν οι διαφορές πεζών-κεφαλαίων γραμμάτων.

Η εντολή which

Η εντολή which, χρησιμοποιείται για να μάθουμε την πλήρη διαδρομή ενός ή περισσοτέρων εκτελέσιμων αρχείων. Αυτό που κάνει είναι να αναζητήσει το αρχείο που ζητούμε σε κάθε κατάλογο που ορίζεται στην διαδρομή $PATH. Λειτουργεί ως εξής:

which filename ...

όπου filename η λίστα των εντολών των οποίων θέλουμε να βρούμε τη διαδρομή.
Για παράδειγμα:

$ which ls find
/bin/ls
/usr/bin/find

Η which χρησιμοποιείται συχνά με το ιστορικό ή την υποκατάσταση εντολών του κελύφους, όπως δείχνει το ακόλουθο παράδειγμα:

$ which ls find
/bin/ls
/usr/bin/find
$ ls -l `!!`
ls -l `which ls find`
-rwxr-xr-x    1 root     root        64428 2003-05-14 00:05 /bin/ls
-rwxr-xr-x    1 root     root        44936 2002-11-03 20:33 /usr/bin/find

το ίδιο αποτέλεσμα επιτυγχάνεται με το συνδυασμό εντολών:

$ ls -l `which ls find`
-rwxr-xr-x    1 root     root        64428 2003-05-14 00:05 /bin/ls
-rwxr-xr-x    1 root     root        44936 2002-11-03 20:33 /usr/bin/find

0
Your rating: None