Σε αυτόν το οδηγό θα δούμε πως μπορούμε να βρούμε αρχεία (και κατάλογους) στους δίσκους που εκπληρούν συγκεκριμένα κριτήρια. Οι κύριες εντολές είναι οι 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 σελίδων εδώ μπόρεσα να καλύψω μόνο τα βασικά, ώστε να μπορείτε ευκολότερα να βρείτε αυτό που θέλετε.