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

Χρησιμοποιώ την εντολή find εδώ και δεκαετίες, αλλά ποτέ δεν την κατάλαβα πραγματικά - μέχρι τώρα. Το να αναγκάσω τον εαυτό μου να την ακολουθήσω και να ξεδιαλύνω αυτή την αόριστη εντολή ήταν το κλειδί της επιτυχίας.
Εισαγωγή στην εντολή find
Η εντολή `find` είναι ένα από τα πιο παράξενα προγράμματα Linux που θα χρησιμοποιήσετε ποτέ. Είναι αρκετά βασική ώστε να είναι πανταχού παρούσα, αλλά και αρκετά μυστηριώδης ώστε να είναι παγκοσμίως αγαπητή. Υπάρχουν εναλλακτικές λύσεις όπως η `fd`, αλλά η `find` είναι ο ελάχιστος κοινός παρονομαστής που σχεδόν πάντα λειτουργεί.
Στις απλούστερες περιπτώσεις, η χρήση της find είναι εξαιρετικά εύκολη:
εύρεση . -όνομα '*.txt'
Αυτός ο συνηθισμένος τύπος ερωτήματος βρίσκει όλα τα αρχεία στον τρέχοντα φάκελο ή σε οποιονδήποτε φάκελο από κάτω του που τελειώνουν σε ".txt". Αν έχετε φτάσει μέχρι εδώ, ίσως να μην έχετε συνειδητοποιήσει πόσο περίπλοκη είναι η συνάρτηση εύρεσης. Η σελίδα τεκμηρίωσής της έχει 1639 γραμμές (έκδοση 4.9.0) και μόλις εμβαθύνετε στη χρήση της συνάρτησης εύρεσης, μοιάζει περισσότερο με μια ολοκληρωμένη γλώσσα προγραμματισμού παρά με ένα βοηθητικό πρόγραμμα.
Αυτή η πολυπλοκότητα με ενοχλούσε πάντα. Πάντα ήθελα έναν απλό τρόπο να βρω αρχεία που έχω τροποποιήσει πρόσφατα, αλλά πάντα μου διέφευγε. Τα αποτελέσματα είτε κατέληγαν ως αρχεία .git είτε ως ένα μπερδεμένο χάος. Έτσι, τελικά αποφάσισα να αρχίσω να χρησιμοποιώ τη συνάρτηση `find`. Το αποτέλεσμα ήταν αναζωογονητικό.
Η βασική χρήση του find μοιάζει με αυτό:
find [starting-point...] [expression]
Η εντολή Find ακολουθεί τα παρακάτω βήματα για να εκτελέσει την εργασία της:
- Κάθε αρχείο και φάκελος υποβάλλεται σε επεξεργασία εντός του σημείου εκκίνησης. Υποστηρίζονται πολλαπλά σημεία εκκίνησης.
- Εφαρμόζει τις δοκιμές· αν το αρχείο τις περάσει όλες, αναλαμβάνει δράση.
- Ενεργεία: Η προεπιλεγμένη ενέργεια είναι -print, η οποία εκτυπώνει το πλήρες όνομα αρχείου.
Η απλή εντολή Find, χωρίς ορίσματα, εμφανίζει τα πάντα στον τρέχοντα φάκελο:

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

Αναζήτηση αρχείων που ανήκουν σε χρήστες
Η πρώτη εργασία είναι εύκολη, χάρη στη δοκιμή εύρεσης χρήστη, η οποία ταιριάζει με το αρχείο μόνο εάν ο τρέχων χρήστης το κατέχει:
find . -user "${USER}"
Ειδοποίηση
Ο χρήστης είναι μια μεταβλητή περιβάλλοντος που περιέχει το τρέχον όνομα χρήστη.
Αν εκτελέσετε τα παραπάνω, ενδέχεται να παρατηρήσετε ότι η έξοδος περιέχει φακέλους:

Για να βεβαιωθείτε ότι η τελική λίστα περιέχει μόνο αρχεία, χρησιμοποιήστε τη δοκιμή τύπου εύρεσης. Αυτή η δοκιμή απαιτεί ένα μόνο γράμμα για να υποδείξει τον αντίστοιχο τύπο αρχείου: f για ένα κανονικό αρχείο, d για έναν φάκελο, l για έναν συμβολικό σύνδεσμο και ούτω καθεξής.
εύρεση . -χρήστη "${ΧΡΗΣΤΗΣ}" -τύπος f
Σε αυτό το στάδιο, βρείτε αναφορές για όλα τα αρχεία—όχι τους καταλόγους—που ανήκουν στον τρέχοντα χρήστη:

Αναζήτηση αρχείων που λείπουν από κρυφούς φακέλους
Το επόμενο μέρος της εργασίας είναι να διακόψετε την αναζήτηση αρχείων από κρυφούς φακέλους. Η ενέργεια `-prune` επιβάλλει την εντολή `find` να αποτρέψει την κατάβασή της σε έναν αντίστοιχο φάκελο.
find . -path "*/.*/*" -prune
Τα αποτελέσματα αυτού μπορεί να φαίνονται περίεργα στην αρχή και είναι σχεδόν το αντίθετο από αυτό που θέλουμε:
Αυτό οφείλεται στον τρόπο λειτουργίας της εντολής prune, οπότε να τι συμβαίνει:
- Η δοκιμή -path αντιστοιχίζει όλα τα αρχεία (συμπεριλαμβανομένων των φακέλων) με μια διαδρομή που περιλαμβάνει τουλάχιστον έναν κρυφό φάκελο.
- Η εντολή -prune εμποδίζει την εντολή find να έχει πρόσβαση σε αυτούς τους φακέλους.
- Δεδομένου ότι δεν υπάρχει άλλη ενέργεια εκτός από την εντολή `-prune`, η εντολή `find` εφαρμόζει την ενέργεια `-print` από προεπιλογή. Αυτό ισοδυναμεί με την εντολή `find . -path “*/.*/*” -prune -print`.
Ωστόσο, αντί να εκτυπώσετε τους κρυφούς φακέλους που έχουν υποστεί επεξεργασία, μπορείτε να εκτυπώσετε οτιδήποτε άλλο χρησιμοποιώντας την εντολή -o:
find . -path "*/.*/*" -prune -o -print
Ο τελεστής -o είναι ένας λογικός τελεστής Ή, που σημαίνει ότι η αναζήτηση θα ταιριάζει είτε με την προηγούμενη είτε με την επόμενη έκφραση. Επομένως, εάν η διαδρομή περιέχει έναν κρυφό φάκελο, θα περικοπεί. Διαφορετικά, θα εκτυπωθεί (μια έκφραση χωρίς δοκιμή θα ταιριάζει πάντα).
Σε αυτό το σημείο, μπορείτε να συγχωνεύσετε την αρχική έκφραση που φιλτραρίστηκε κατά κάτοχο και τύπο αρχείου:
find . -path "*/.*/*" -prune -o -user "${USER}" -type f -print
Αυτή η εντολή αναζήτησης προσδιορίζει όλα τα απαιτούμενα αρχεία και τίποτα περισσότερο:

Το μόνο που απομένει είναι να τα ταξινομήσετε με βάση τις πιο πρόσφατες τροποποιήσεις και να εμφανίσετε αυτήν την ημερομηνία δίπλα σε κάθε αρχείο.
Ειδοποίηση
Μπορείτε να χρησιμοποιήσετε τη δοκιμή -path για να επιτύχετε τα ίδια αποτελέσματα, χρησιμοποιώντας μια ελαφρώς μικρότερη εντολή:
find . -type f -not -path '*/.*/*' -user “${USER}”
Δοκιμάζοντας αυτό, θα έχετε τα ίδια αποτελέσματα με την έκδοση που χρησιμοποιεί το `-prune`. Η διαφορά είναι ότι το `-prune` είναι πιο αποτελεσματικό επειδή αποφεύγει τον έλεγχο αρχείων σε κρυφούς φακέλους. Εάν εργάζεστε με πολλούς φακέλους, θα πρέπει πάντα να χρησιμοποιείτε το `-prune` για να παρακάμψετε τυχόν φακέλους που μπορείτε να αποφύγετε.
Ταξινομήστε και εκτυπώστε τα αποτελέσματα με ακρίβεια
Η εντολή `find` δεν ταξινομεί από μόνη της. Επομένως, μπορείτε να χρησιμοποιήσετε την `sort`, μια βασική εντολή επεξεργασίας κειμένου. Θα χρειαστείτε πρώτα την ημερομηνία τροποποίησης για κάθε αρχείο. Η διαδικασία `-printf` της εντολής `find` καθορίζει τον τρόπο λήψης του ακριβούς αποτελέσματος:
find . -path "*/.*/*" -prune -o -user "${USER}" -type f -printf "%TY-%Tm-%Td %p\n"
Η διαδικασία -printf θα χρησιμοποιήσει το περιεχόμενο της συμβολοσειράς σε εισαγωγικά για να μορφοποιήσει τις πληροφορίες του αρχείου. Σε αυτό το παράδειγμα, το %TY αναφέρεται στο έτος της τελευταίας τροποποίησης. Το %Tm και το %Td είναι ο μήνας και η ημέρα, αντίστοιχα, ενώ το %p είναι το όνομα του αρχείου.

Μπορείτε να καθορίσετε ένα πιο λεπτομερές εύρος ημερομηνιών για μια πιο ακριβή ταξινόμηση, αλλά εμένα με ενδιαφέρουν μόνο οι ημερομηνίες, επομένως το τελευταίο βήμα είναι να μετακινήσετε τα δεδομένα στην ταξινόμηση. Παρατηρήστε ότι ταξινομώ κάθε γραμμή πρώτα κατά ημερομηνία. Αυτό εξυπηρετεί δύο σκοπούς: διατηρεί τα πάντα συνεπή, αλλά διευκολύνει επίσης την ταξινόμηση. Απλώς μετακινήστε τα αποτελέσματα από την "Αναζήτηση" στην "Ταξινόμηση":
find . -path "*/.*/*" -prune -o -user "${USER}" -type f -printf "%TY-%Tm-%Td %p\n" | sort
Η χρήση της εντολής `find` απλοποιεί τη διαχείριση αρχείων και δίνει στους χρήστες μεγαλύτερο έλεγχο στην οργάνωση του συστήματος. Με επαναλαμβανόμενη χρήση, οι διάφορες συντακτικές συντάξεις της εντολής θα γίνουν οικείες και μπορούν να τροποποιηθούν γρήγορα για ακριβή αποτελέσματα. Η κατανόηση των βασικών βοηθά στη μετέπειτα μετάβαση σε πιο προηγμένες χρήσεις, όπως ο συνδυασμός του `find` με το `grep` ή η εφαρμογή του με άλλες εντολές για πιο ισχυρό αυτοματισμό.





