Αναζητώντας αρχεία. Ένας οδηγός

Σε αυτόν το οδηγό θα δούμε πως μπορούμε να βρούμε αρχεία (και κατάλογους) στους δίσκους που εκπληρούν συγκεκριμένα κριτήρια. Οι κύριες εντολές είναι οι find, locate καθώς και η xargs.

Με αυτές τις εντολές ενδεικτικά μπορούμε να βρούμε:

  • Αρχεία με ονόματα που ακολουθούν κάποιο πρότυπο
  • Αρχεία με μέγεθος που είναι σε αναμέσα σε ένα διάστημα τιμών
  • Αρχεία που ανήκουν σε κάποιον χρήστη,
  • Αρχεία που έχουν προσπελαστεί ή αλλάξει σε ένα χρονικό διάστημα
  • Αρχεία με συγκεκριμένα δικαιώματα
  • Αρχεία με βάθος n καταλόγους
  • Αρχεία που περιέχουν κάποιο κείμενο
  • Συνδέσμους που δείχνουν σε ένα συγκεκριμένο αρχείο
  • Οποιοδήποτε συνδυασμό των παραπάνω

Το να βρεις τα αρχεία είναι η μισή δουλεία. Μετά που θα τα βρούμε μπορούμε να

  • Να δούμε τα ονόματα τους ή να τα αλλάξουμε
  • Να τα σβήσουμε, να τους αλλάξουμε όνομα, η να τα μετακινήσουμε
  • Τα τα συμπιέσουμε , -ls, -fprint filename για έξοδο σε αρχείο, -printf
  • Και σχεδόν οτιδήποτε άλλο

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

Ιντερλούδιο: Η εντολή locate

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

locate -e '*[Mm]akefile'

θα βρει όσα αρχεία ικανοποιούν το πρότυπο '*[Mm]akefile', δηλάδη περιέχουν κάποιους χαρακτήρες και μετά Makefile ή makefile. Είναι σημαντικό το πρότυπο να είναι μέσα σε εισαγωγικά, διαφορετικά θα το ερμηνεύσει το κέλυφος. Η σημαία -e από το existing θα φιλτράρει τα αρχεία που έχουν σβηστεί από τότε που ενημερώθηκε η βάση. Αυτή ενημερώνετε ανα τακτά χρονικά διαστήματα, αλλά αν θέλετε να το κάνετε τώρα η εντολή είναι

sudo updatedb &

Σε ένα δίσκο SSD ειναι μια διαβολικά γρήγορη διαδικασία.

H εντολή xargs

H εντολή xargs κάνει κάτι απλό. Περνάει αρχεία από ένα κατάλογο σαν ορίσματα σε μια εντολή. Για παράδειγμα πες πως με κάποιο τρόπο έχεις μια λίστα με αρχεία σε ένα αρχείο κειμένου, μια γραμμή ανά εντολή και θέλεις να τα συμπιέσεις.

cat file_list.txt | xargs zip myfiles.zip 

και αυτό θα μεταφραστεί σαν

zip myfiles.zip file1 file2 file3 .....

Σημείωση: Οι γνώστες θα πουν πως μπορείς να το κάνεις με cat file_list.txt | zip myfiles.zip -@, αλλά δεν υποστηρίζουν όλες οι εντολές αυτή την δυνατότητα.

Η χρήση της xargs είναι κυρίως για να κάνουμε την εντολή find να δρα σε ομάδες αρχείων. Περισσότερα για αυτό στην συνέχεια.

Η εντολή find

Η εντολή find βρήσκει αρχεία με βάση τα κριτήρια που θέτουμε. Είναι μια πολύπλοκη εντολή γιατί κάνει πολύπλοκα πράγματα. Σε ένα πρώτο παράδειγμα θέλουμε να δούμε ποια αρχεία κάτω απο το /usr/share/doc είναι παραδείγματα σε γλώσσα C και είναι μεγαλύτερα από 10 KiB.
, -ls, -fprint filename για έξοδο σε αρχείο, -printf
find /usr/share/doc -name ‘*.c’ -and -size +10k -print

Πολύπλοκο έτσι δεν είναι; Ας το δούμε σιγά σιγά και όλα θα αποκτήσουν νόημα Η γενική σύνταξη είναι

find [που... ] [ ορίσματα]

Τα ορίσματα χωρίζονται σε 4 κατηγορίες: α. Σε αυτά που επιδρούν σε όλη την εντολή, όπως τα τυπικά τα ορίσματα κάθε εντολής β) Σε τεστ όπως -size +10k (Το + γενικά δηλώνει μεγαλύτερο από, το - δεν θα σας πω να το βρείτε μόνοι σας, και απουσία συμβόλου σημαίνει ακριβώς) γ) Δράσεις όπως -print, -delete, -exec. δ) τελεστές όπως -and, -or. Η προκαθορισμένη ενέργεια είναι ή -print και ο προκαθορισμένος τελεστής είναι ο -and. Η παραπάνω εντολή μπορεί να γραφτεί και σαν

 find /usr/share/doc -name '*.c'  -size +10k 

Βασικά τεστ

Για να το κρατήσω σύντομο θα εξηγώ με παραδείγματα και όχι με κείμενο. Μια φαντασία είναι απαραίτητη. Αν μπορείς να βρεις αρχεία που ανήκουν σε ένα χρήστη θα μπορείς λογικά να βρεις με κάποιο τρόπο και αυτά που ανήκουν σε ένα γρουπ. Δείχνω μόνο την πρώτη περίπτωση. Η φαντασία θα σου δείξει τι μπορεί να υπάρχει ο τρόπος θα βρεθεί στο βιβλίο (ή με μια ερώτηση εδώ). Το άρθρο είναι wiki και μπορείς επίσης να προσθέσεις παραδείγματα ή να αλλάξεις το κείμενο.

  • -name '*.texi' Με βάση το όνομα του αρχείου
  • -iname 'foo{1,2}' Χωρίς διάκριση κεφαλαίων/μικρών πχ fOO2, Foo1, foo2
  • -amin +2 -amin -6 αρχεία που άλλαξαν (m) 2 με 6 λεπτά πριν. Επίσης c(reate)
  • -empty Κενά αρχεία. Επίσης -size.
  • -type l,f Συμβολικός σύνδεσμος ή κανονικό αρχείο
  • -user talos Αρχεία που ανήκουν στον χρήστη
  • -executable Αρχεία που είναι εκτελέσιμα

Δράσεις

Με την -exec ή -execdir μπορούμε να τρέξουμε οποιαδήποτε εντολή. Οτιδήποτε ακολουθεί θεωρείτε όρισμα της εντολής μέχρι να βρεθεί ένα ';' ή ένα \; το όνομα του αρχείου θα αντικαταστήσει το '{}'. Τα εισαγωγικά είναι απαραίτητα για να μην τα ερμηνεύσει αλλιώς το κέλυφος.

Ας βρούμε διαφορές σε αρχεία σε σχέση με κάποιο template

 find . -name 'shopping_*.txt' -exec diff -u `{}` main_list.txt `;`

H εντολή θα εκτελέστεί τόσες φορές όσα αρχεία βρεθούν

diff -u shopping_02_02_2020.txt main_list.txt 
diff -u shopping_03_02_2020.txt main_list.txt `;`

Άλλες φορές έχει νόημα να εκτελεστεί μία φορά η εντολή σε πολλαπλά αρχεία. Τότε θα γράψουμε '{} +'. Αυτό είναι πολύ ποιο ασφαλές απο την χρήση του xargs.

Άλλες δράσεις

  • -print, -ls, -fprint filename για έξοδο σε αρχείο, -printf
  • -delete

Για περισσότερα

Για περισσότερα δείτε το επίσημο βιβλίο εδώ: https://www.gnu.org/software/findutils/manual/find.html από όπου πήρα και τα περισσότερα παραδείγματα. Με ένα πλήθος 100 σελίδων εδώ μπόρεσα να καλύψω μόνο τα βασικά, ώστε να μπορείτε ευκολότερα να βρείτε αυτό που θέλετε.

5 Likes

Για την find δείτε και το βίντεο:

3 Likes