ABSTRACT: das find kommando zum suchen von datein wird ueberblicksmaessig vorgestellt. AUDIENCE: beginners SYSTEM: any unix SECTION: basic unix commands AUTHOR: mond COPYRIGHT: GNU Free Documentation Licence http://www.gnu.org/licenses/fdl.txt find. find ist so aehnlich wie locate. locate kennen wir ja schon. find ist viel leistungsfaehiger und sucht "live" (d.h. nicht in einer naechtlich erstellten liste sondern direkt im verzeichnissbaum.) find ist daher langsamer. ich beschreibe hier wieder das GNU find programm. komerzielle find habe ueblicherweise nicht ganz alle funktionen die hier aufgezaehlt sind. find /verzeichnisname listet alle datein und verzeichnissnamen unterhalb von /verzeichnissname. wenn du z.b. find . in deinem homeverzeichniss eingibst findest du alle datein und verzeichnisse unterhalb deines aktuellen (in disem falle ist das dann das homeverzeichniss) verzeichnisses. find /etc finded alle datein und verzeichnisse unterhalb von /etc etc.. ueblicherweise will man aber nicht "alles" finden sondern will die suche einschraenken. find bietet dazu sehr viele moeglichkeiten. man kann mehrere kriterien angeben wie man die suche einschraenken will. diese werden alle "und-verknueft" d.h. sie muessen alle erfuellt sein (man kann sie auch oder verknuepfen das braucht man aber eher selten..) z.b.: find . -name \*.txt sucht alle files die auf .txt aenden. ( das \ vor dem stern ist notwendig um der shell zu sagen dass sie den * nicht besonders behandeln soll und das suchmusster einfach an find weiterzugeben.. andernfalls wuede die shell das *.txt durch die namen aller textfiles im aktuellen verzeichniss ersetzten. das ist normalerweise nciht was man will.. man will ja auch alle files mit .txt in allen unterverzeichnissen finden et... ) find . -type f findet nur files und keine verzeichnisse oder sonstige sonderdateien (type f). find . -type d findet nur verzeichnisse (type d) und keine files. und jetzt eine kombination: find . -type d -name a\* wuerde alle verzeichnisse finden deren namen mit a beginnt. es gibt etwa 40 kriterien nach denen man files auswaehlen kann. hier nur die wichtigsten optionen: -size 100k wuerde alle files finden die genau 100 kilobytes lang sind da gibt es natuerlich nicht sehr viele. nueztlicher ist meist: -size +100k findet alle files die groesser als 100k sind oder -size -100k alle die kleiner sind als 100k. (du kannst natuerlich auch jede andere goresse angeben.. ) -newer filename listet alle files die neuer sind als das file filename. aehnlich: -mtime n alle files die genau n tage zuvor geschrieben oder veraendert wurden.(m steht fuer modified) -mtime +5 alle files die aelter als 5 tage sind -mtime -3 alle files die weniger als 3 tage alt sind. ok. hier einige konkrete anwendungen. angenommen du hast zuwenig plazt auf einer partition und willst die files finden die am meisten platz brauchen. du machst z.b.: find / -size +2000k > bigfiles.txt speichert eine liste aller files die groesser als 2000 kilobyte sind im file bigfiles.txt wenn du dann z.b.: ls -lSr $(cat bigfiles.txt) gibt dir eine liste nach groesser geordnete (-S fuer size) dieser files aus. (das $( ) setzt auf der commandline die ausgabe des befehls cat bigfiles.txt ein. und dort haben wir ja schon die grossen files gespeichert...) (obiges beispiel hat das problem dass es mit files die leerzeichen im namen haben nicht umgehen kann.. und kann unter umstaenden sogar ein sicherheitrisko darstellen wenn jemand files anlegt deren name ein unix befehl ist.. beispiel 2. du willst in einem tar file alle files speichern die sich in die der letzten woche geaendert haben: das geht z.b. mit: tar cfvzp sicherung.tgz $( find / -mtime -8 -type f) ( den tar befehl kennen wir schon. ) da die liste von files laenger als 32768 zeichen lang werden koennte ist es in diesem fallle dann besser folgenden befehl zu verwenden: find / -mtime -8 -type f > neuefiles.txt tar -c -T neuefiles.txt -v -z -p -f sicherung.tgz die option -T sagt dem tar dass es die liste der zu speichernenden files aus der datein neuefiles.txt lesen soll... (tar hat uebrigens auch eine option eingebaut die es erlaubt files auszuaehlen die neuer als ein gewisses datum sind) weitere optionen von find erlauben es z.b. nach files zu suche die einem bestimmten user oder einer bestimmten gruppe gehoeren oder die bestimmte zugriffsrechte haben. weiters laesst sich die suche auf eine bestimmte tiefe oder auf ein einzelnes filesystem einschraenken. optionen koennen auch mit einem logischen "oder" ( -o ) verknuepft werden. weiters hat man die moeglichkeit fuer jedes gefundene file sofort einen befehl auszufuehren ( -exec ). z.b.: find . -name \*.txt -exec echo der name des files ist {} \; fuerht den befehl echo der name des files ist {} fuer jedes gefunde file (in diesem fall files die auf .txt enden) aus. das {} wird dabei von find durch den namen des gefundenen files ersetzt. und \; beendet den -exec teil. oft nuetzlich ist auch die option -printf die es erlaubt auch andere dateiatribute als den namen auszugeben. (genaueres siehe manpage oder info seite). z.b: find . -size +100k -printf "%s\t%p\n" | sort -n gibt bei allen datein die groesse ( %s und den namen %p aus). diese werden dann durch durch den sort befehl "gepipet" und damit auch noch nach der groesse geordnet. was wir hier sehen: durch die kombination einiger weniger leistungsfaehiger befehle kann man viele probleme loesen zu denen man bei windows teure und spezialisierte programme verwenden muesste.. die nicht mal standardmaessig beim betriebsytem dabei sein.. und die jedes fuer sich auch wieder einen hohen lernaufwand haetten.. bei unix lernt man einmal ein paar befehle und die kann man sehr vielfaeltig kombinieren.... EXERCISES: verwende den find befehl um * alle files unterhalb von /etc aufzulisten * alle files unterhalb deines homeverzeichnisses zu finden die auf .html enden * alle directory namen auf deiner festplatte aufzulisten. * alle files in deinem homeverzeichniss zu finden die innerhalb der letzten 3 tage geaendert wurden. * alle files finden die groesser als 2000 kbyte gross sind. * alle files die auf .txt enden, in den lezten 2 tagen geaender wurden und kleiner als 10k byte sind mit cat auszugeben. (welche verschiedenen wege gibt es um dies zu loesen?) REFERENCES: man find info find