Es gibt mehrere Möglichkeiten. Es kommt auch darauf an, ob du nach Dateiname oder Dateiinhalt suchen willst, und was du suchen willst. Ich habe unten mal die wichtigsten Möglichkeiten zusammengefaßt. Es steht Dir natürlich völlig frei, einen kleinen Perl-Zweizeiler zu schreiben, der *exakt* Deine Aufgabe erledigt, falls Dir das hier alles nicht paßt ;-)
Es gibt:
Auf einem typischen Linux-System gibt es normalerweise zwischen 20.000 und 60.000 Dateien. Wenn du eine Suche startest, kann das schon mal etwas dauern. Deshalb gibt es auf fast jeder Distribution das Programm locate, welches einmal in der Nacht oder einmal nach jedem Systemstart vom gesamten Verzeichnisbaum eine Datenbank erstellt. Mit
$ locate Geburtstag
findet das Programm dann blitzschnell (meist in einigen Sekunden) die richtige Datei(en) -
/home/jens/Texte/Geburtstagsgrüße.dvi
/home/jens/Texte/Geburtstagsgrüße.log
/home/jens/Texte/Geburtstagsgrüße.ps
/home/jens/Texte/Geburtstagsgrüße.tex
Achtung: locate läuft normalerweise als `nobody', das ist ein Useraccount, welchr fast ueberhaupt nichts darf. D.h falls Du irgendwelche "geheimen" Verzeichnisse bei Dir pflegst, wird locate darin enthaltene Dateien nicht in seine Datenbank aufnehmen (können).
Dafür gibt es einen Ersatz, genannt `secure-locate', der als root läuft, aber die Zugriffsrechte der Dateien mit abspreichert und damit dann das "Finden" von Dateien davon abhängig macht, ob der "Sucher" die Datei auch sehen darf. Dieser ist allerdings nicht in jeder Distribution dabei und etwas aufwendiger zu konfigurieren -- Sicherheit hat halt ihren Preis.
whereis durchsucht die Standardpfade nach binaries ("EXE-Dateien"), Dokumentation, Konfigurationsdateien und Quellcode (sources) eines Programmes, das dem angegebenen Namen entspricht. Zum Bleistift
$ whereis sendmail
sendmail: /usr/lib/sendmail /usr/lib/sendmail.cf
/usr/lib/sendmail.hf /etc/sendmail.cf /usr/sbin/sendmail
/usr/man/man8/sendmail.8.gz
which beantwortet die Frage "wenn ich jetzt XYZ eingebe, wo liegt dann das Programm welches gestartet wird?" Das ist vor allem nützlich, wenn man mehrere Programme hat die gleich heißen, und man will schnell wissen, welches nun zuerst im `PATH' liegt.
Achtung: `which' weiß nichts über die Shell und deren interne Befehle! Man sollte deshalb vermeiden, ein eigenes Programm test zu nennen, denn es gibt ein Shell-Interna namens test -- dann kommt das externe Programm nie zu Potte! =;)
find durchsucht das angegebene Verzeichnis nach entsprechenden Dateien.
find /home/jens -iname "blubb.*"
Suche in meinem `HOME' nach allen Dateien die auf `blubb.*' passen und achte nicht auf Groß/Kleinschreibung (wie sonst ja üblich).
find /usr/doc -type d -maxdepth 2
Suche in `/usr/doc' nach allen `d'irectories und gehe maximal 2 Verzeichnisebenen tiefer.
find / -type f -empty
Suche im gesamten System nach allen leeren Dateien (f=file).
find / -name "*conf" -xdev
Suche auf der Partition, die `/' enthält, nach `*conf', aber gehe nicht in Verzeichnisse, die auf anderen Partitionen liegen.
find / -type f -size +1000k -iname "*.ps" -exec gzip -9 \{\} \;
Suche im gesamten System nach allen Dateien (`f') die größer als 1MB sind und in `*.ps' enden und komprimiere sie. Die Zeichenkette {} wird von find mit dem jeweiligen Dateinamen ersetzt, und zwischendurch gehört ein Semikolon als Befehlstrenner, aber diese Zeichen müssen "durch" zu find gelangen und wenn man sie nicht mit dem Escape-Zeichen \ sozusagen "festnagelt", würden sie von der Shell interpretiert und das wollen wir hier nicht.
Ist alles eigentlich ganz harmlos :-))
Grep sucht in Dateien, nach Inhalten. Der Name kommt von "Get Regular Expression", ein Regulärer Ausdruck ist ungefähr das, was in DOS die Zeichen ? und * für Dateinamen bedeuten, nur halt erwachsen geworden. :) Beispiele:
rm [a-k]* # dürfte klar sein
mv *.{zip,rar,arj} /tmp # doch auch noch, oder?
cp [^0-9]??x*[1-3,a-c].txt /home/müll/ # so, jetzt aber :)
Der letzte sagt folgendes aus: Alles was nicht(^) mit 0..9 beginnt, dann genau zwei bel. Buchstaben, ein "x" und beliebig viele beliebige folgen, und dann noch mal ein Buchstabe, und zwar 1,2,3,a,b, oder c. Dann ein Punkt und ein "txt".
Alles klar? :-) Also: z.B.
'grep socket /etc/' sucht in /etc/* nach "socket" in jeder Datei
'grep TCP.*IP /etc/rc.d/' sucht nach TCP(irgendwas)IP
'grep -i "blubb" /home/jens/Ramsch/*.txt
sucht ohne Groß/kleinschreibung zu beachten meinen Ramsch durch
Man kann grep noch sagen, ob und wie er Dateinamen und -inhalt(sausschnitte) bei (Nicht-)Erfolg (nicht) anzeigen soll -- das erfährt man alles in den Manual Pages zu grep.
Die regulären Ausdrücke der Shell und der div. Programme unterscheiden sich -- leider -- etwas, und man darf sie nicht mit den Standard-Wildcards verwechseln. So ist z.B. ".*" fuer grep gleich "Ein beliebiges Zeichen und genau davon beliebig viele", fuer die Bash wäre das nur "*". Das ist -- wie so vieles -- historisch bedingt.