| |
|
|
| |

find
"find" ist so ähnlich wie "locate", jedoch viel leistungsfähiger und sucht "live" (d.h. nicht in einer
nächtlich erstellten Liste sondern direkt im Verzeichnissbaum.) "find" ist
daher langsamer.
Hier wird das GNU "find" Programm beschrieben. Kommerzielle "find" haben üblicherweise nicht alle Funktionen die hier aufgezählt sind.
find /verzeichnisname
listet alle Dateien und Verzeichnisnamen unterhalb von /verzeichnissname auf. wenn du z.B.
find .
in deinem Homeverzeichnis eingibst, findest du alle Dateien und Verzeichnisse unterhalb deines aktuellen Verzeichnisses (in diesem Falle ist das dann das Homeverzeichnis) .
find /etc
findet alle Dateien und Verzeichnisse unterhalb von /etc
usw.
Üblicherweise will man aber nicht "alles" finden sondern will die Suche einschränken. "find" bietet dazu sehr viele Möglichkeiten. Man kann mehrere Kriterien angeben, wie man die Suche einschränken will. Diese werden alle "und-verknüft" d.h. sie müssen alle erfüllt sein (man kann sie auch "oder-verknüpfen" das braucht man aber eher selten.)
z.B.:
find . -name \*.txt
sucht alle Files die auf .txt enden. (das \ vor dem Stern ist notwendig um der Shell zu sagen dass sie den * nicht besonders behandeln soll und das Suchmuster einfach an "find" weitergeben soll. Andernfalls würde die Shell das *.txt durch die Namen aller Textfiles im aktuellen Verzeichnis ersetzen. Das ist normalerweise nicht was man will. Man will ja auch alle Files mit .txt in allen Unterverzeichnissen finden)
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*
würde alle Verzeichnisse finden deren Namen mit a beginnt.
es gibt etwa 40 Kriterien nach denen man Files auswählen kann. Hier nur die wichtigsten Optionen:
-size 100k
würde alle Files finden die genau 100 Kilobytes lang sind. Da gibt es natürlich nicht sehr viele. nützlicher ist meist:
-size +100k
findet alle Files die grösser als 100k sind
oder
-size -100k
alle die kleiner sind als 100k. (du kannst natürlich auch jede andere Grösse angeben.)
-newer filename
listet alle Files die neuer sind als das File "filename".
ähnlich:
-mtime n
alle Files die genau n Tage zuvor geschrieben oder verändert wurden. (m steht für "modified")
-mtime +5
alle Files die älter als 5 Tage sind
-mtime -3
alle Files die weniger als 3 Tage alt sind.
Hier einige konkrete Anwendungen:
Beispiel 1:
Angenommen du hast zuwenig Platz auf einer Partition und willst die Files finden die am meisten Platz brauchen.
find / -size +2000k > bigfiles.txt
speichert eine Liste aller files die grösser als 2000 Kilobyte sind im File "bigfiles.txt"
ls -lSr $(cat bigfiles.txt)
gibt dir eine nach Grösse geordnete Liste (-S für "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. Das kann unter Umständen sogar ein Sicherheitrisiko darstellen wenn jemand Files anlegt deren Name ein Unix-Befehl ist.
Beispiel 2:
Du willst in einem "tar" File alle Dateien speichern, die sich in die der letzten Woche geändert haben:
das geht z.B. mit:
tar cfvzp sicherung.tgz $( find / -mtime -8 -type f)
Da die Liste von Files länger als 32768 Zeichen lang werden könnte, ist es in diesem Falle 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 Datei neuefiles.txt lesen soll. ("tar" hat übrigens auch eine Option eingebaut, die es erlaubt Files auszuwählen, die neuer als ein gewisses Datum sind)
Weitere Optionen von "find" erlauben es z.B. nach Files zu suchen, die einem bestimmten User oder einer bestimmten Gruppe gehören oder die bestimmte Zugriffsrechte haben. Weiters lässt sich die suche auf eine bestimmte Tiefe oder auf ein einzelnes Filesystem einschränken.
Optionen können auch mit einem logischen "oder" ( -o ) verknüpft werden. Weiters hat man die Möglichkeit für jedes gefundene File sofort einen Befehl auszuführen ( -exec ). z.B.:
find . -name *.txt -exec echo der name des files ist {} ;
führt den Befehl
echo der name des files ist {}
für jedes gefunde File (in diesem Fall Dateien, die auf .txt enden) aus. Das {} wird dabei von "find" durch den Namen des gefundenen Files ersetzt. Und ; beendet den -exec teil.
Oft nützlich ist auch die Option
-printf
die es erlaubt, auch andere Dateiattribute als den Namen auszugeben. (Genaue;res siehe Manpage oder Info seite). z.b:
find . -size +100k -printf "%s\t%p
" | sort -n
gibt bei allen Dateien die Grösse %s und den Namen %p aus. Diese werden dann durch durch den "sort" Befehl "gepiped" und damit auch noch nach der Grösse geordnet.
Was wir hier sehen: durch die Kombination einiger weniger leistungsfähiger Befehle kann man viele Probleme lösen zu denen man bei Windows teure und spezialisierte Programme verwenden müsste, die nicht mal standardmässig beim Betriebsystem dabei sind, und die jedes für sich auch wieder einen hohen Lernaufwand hätten. Bei Unix lernt man einmal ein paar Befehle und die kann man sehr vielfältig 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 geändert wurden.
* alle Files finden, die grösser als 2000 Kbyte gross sind.
* alle Files die auf .txt enden, in den letzten 2 Tagen geändert wurden und kleiner als 10Kbyte sind mit "cat" auszugeben. Welche verschiedenen Wege gibt es um dies zu lösen?
REFERENCES:
man find
info find
|
|
| |
|
|
|