Οδηγός Εύρεσης

Από Κοινότητα Ελεύθερου Λογισμικού ΕΜΠ
Μετάβαση σε: πλοήγηση, αναζήτηση

Για την εύρεση αρχείων, συμβολοσειρών κλπ χρησιμοποιούμε κυρίως συγκεκριμένα utilities από τις εποχές του Unix, που σήμερα πλέον περιέχονται στις περισσότερες (αν όχι σε όλες) Unix-like διανομές ελεύθερων λειτουργικών συστημάτων.

find, εύρεση αρχείων

Η GNU υλοποίηση της εντολής find, το GNU find, βρίσκεται σε όλες τις μεγάλες διανομές GNU/Linux. Το find αναζητάει αρχεία στο file system σύμφωνα με τις επιλογές και τα μοτίβα αναζήτησης που του καθορίζουμε.

Η μορφή της εντολής είναι η εξής:

find <τοποθεσία> <επιλογές> [<ενέργειες>]

Για παράδειγμα, θέλουμε να βρούμε όλα τα αρχεία στους δίσκους μας με ένα συγκεκριμένο όνομα:

find / -name .vimrc 2>/dev/null

Με αυτήν την εντολή ψάχνουμε στο /, το root filesystem και όλα τα subdirectories αναδρομικά, για ένα αρχείο με όνομα .vimrc. Επίσης ανακατευθύνουμε όλα τα errors στο /dev/null γιατί δεν τρέχουμε την εντολή ως root. Πιθανά αποτελέσματα αυτής της εντολής:

user ~ % find / -name .vimrc 2>/dev/null
/home/user/.vimrc
/home/pistolas/.vimrc
/home/axyristos/.vimrc

Αν δεν βάζαμε το 2>/dev/null θα είχαμε πολλά errors της μορφής "find: `DIR': Permission denied" για όλα τα DIR που δεν έχει access ο user.

wildcards

Με το find έχουμε πολλές επιλογές: μπορούμε να βρούμε αρχεία με wildcards αν δεν ξέρουμε ολόκληρο το όνομα:

user ~ % find /home/user/ -name 'ergasia*'
/home/user/ergasia1.tex
/home/user/ergasia2.tex

ignore case

Μπορούμε επίσης να αγνοήσουμε τα κεφαλαία/μικρά και να ψάξουμε και για τα δυο με το -iname:

user ~ % find /home/user/ -iname 'ergasia*'
/home/user/2Exercise/Ergasia2.cpp
/home/user/1Exercise/Ergasia1.cpp
/home/user/ergasia1.tex
/home/user/ergasia2.tex

εκτέλεση εντολών στα αποτελέσματα

Μπορούμε να εκτελέσουμε εντολές στα αποτελέσματα του find με την επιλογή -exec, στη μορφή:

-exec COMMAND [επιλογές] {} \;

όπου το {} θα αντικατασταθεί με το όνομα κάθε αρχείου. Για παράδειγμα, επεκτείνοντας τη προηγούμενη εντολή:

user ~ % find /home/user/ -iname 'ergasia*' -exec rm {} \;
user ~ % 

όλα τα αρχεία που βρέθηκαν διαγράφτηκαν.

grep, αναζήτηση κειμένου

Στο manpage του GNU grep βλέπουμε ότι η βασική μορφή της εντολής grep είναι

grep [OPTIONS] PATTERN [FILE...]

για να ψάξουμε π.χ. για μια συνάρτηση insertFile στο τρέχον directory αναδρομικά

user ~/code % grep -r "insertFile" *
Binary file a.out matches
project/project.c:void insertFile(File *, char *);
project/project.c:            insertFile(&(*cell)->files,filename);
project/project.c:void insertFile (File * fl, char * filename) {
project/project.c:        insertFile(&(*fl)->next,filename);

Κάποια χρήσιμα options της εντολής grep είναι τα εξής

option περιγραφή
-i ignore case (τυπώνει αποτελέσματα σε είτε κεφαλαία είτε μικρά)
-v invert match (τυπώνει αποτελέσματα που δεν ταιριάζουν με την αναζήτηση)
-w word regexp (τυπώνει γραμμές που το PATTERN αναζήτησης είναι ολόκληρη λέξη και όχι substring)
-c count (τυπώνει τον αριθμό των αποτελεσμάτων αντί τα αποτελέσματα)
-R, -r, --recursive αναδρομική αναζήτηση σε ένα κατάλογο αρχείων
-n τυπώνει τον αριθμό γραμμής σε κάθε αποτέλεσμα

pipes

Το grep δεν μπορεί να αναζητήσει μόνο σε αρχεία αλλά και στο standard input (stdin) που του δίνουμε μέσω κάποιου pipe. Για παράδειγμα εντελώς πρόχειρα μπορούμε να βρούμε τα αρχεία που ανήκουν στο root στο τρέχοντα κατάλογο ως εξης

user ~ % ls -l | grep root
-rw-r--r--  1 root   root       22459696 Dec 16  2013 openmw_0.29.0-1+b1_amd64.deb
-rw-r--r--  1 root   root           6711 Jun 21  2014 install.sh
-rw-r--r--  1 root   root    15929966592 Jan 15 12:43 tails_image
drwxr-xr-x  2 root   root           4096 Oct 27 21:22 usb_image
-rw-r--r--  1 root   root   268435456000 Oct 28 04:19 usb_backup
-rw-r--r--  1 root   root            246 Oct 28 04:19 usb_backuplog

regexp

TODO

Παραλλαγές του grep

TODO

Διαβάστε περισσότερα

  • man find
    • info find
  • man grep