* Horst Jäger schrieb am 25.Jun.2003:
1. "man find ist das was Du lesen solltest." haben einige geantwortet. Dazu muss ich ne Grundsatzerklärung loswerden:
Ich gebe Dir Recht, daß die manpage in erster Linie als Nachschlagewerk gedacht sind, und nicht als Tutorial. Trotzdem sind sie gut. Wenn man was nachschlagen will, dann stört nichts mehr als irgend ein blabla rundherum, den man zum Lernen zweifelsohne braucht. Es sind zwei verschiedene Dinge. Wenn Dich jemand auf manpages hinweist, so versteh das doch nicht als Klatsche. So ist das ganz bestimmt nicht gemeint. Man sieht es Dir doch nicht an, inwieweit Du schon Erfahrung mit Linux hast. Auch wenn Du ein Newbie bist, so heißt das nicht allzuviel. Die Lernkurve ist nun mal bei Linux steil. find ist ein mächtiges Werkzeug, mit dem man massig viel machen kann. Daher ist es vielleicht auch besser, wenn Du nicht als erstes sowas kompliziertes machst, wie nach bestimmten Dateien mit bestimmten Inhalten zu suchen. Es nützt doch nichts, wenn Du hier von der Liste Kochrezepte erhälst, bist aber selber nicht in der Lage sie abzuwandeln, vielleicht abgesehen von anderen Namen. Es wäre schon gut, wenn Du das alles auch verstehst. Und das willst Du offensichtlich auch.
find / -iname '*.txt' -exec grep egal {} \; tut's, aber klappt nicht mit z.B. egal* . Das Problem hatte ich früher schon: man muss Anführungszeichen setzen ("egal*" ) und das klappt auch nicht - jemand hat mich auch in seiner Mail davor gewarnt.
Du hast ja schon eine Menge Hinweise bekommen. Aber Deine Anmerkung zu den Anführungszeichen weist darauf hin, daß Du etwas ganz Grundsätzliches noch nicht verstanden hast. Es ist für einen Anfänger auch nicht leicht zu durchblicken, nämlich, was macht die shell und was macht ein einzelnes Programm. Bitte sei mir nicht böse, wenn ich Dir was erzähle, was Du schon weißt. Aber ich fange lieber von unten an, als daß ich was vorraussetze, was Du nicht weißt. Als erstes sollte Dir klar sein, was man macht, wenn man an der Konsole sitzt, oder einem Xterm, oder der KDE-Konsole oder was es sonst noch so an Terminalemulatoren gibt. Man gibt was ein, und bekommt evtl. was zurück und dann kommt ein Prompt, wo man wieder was eingeben kann. Dies alles macht die shell, meist ist es die bash, eine spezielle shell, andere shells sind ksh, tcsh, csh, zsh und viele andere. Meist hat man bei Linux aber die bash und da gehe ich mal von aus, daß Du die auch hast. Die bash benutzt Du interaktiv. Das heißt, Du gibst was am Prompt ein, die shell macht was draus und Du bekommst das nächste Prompt. Normalerweise gibt man aber Befehle ein, die die shell nicht selber bearbeitet sondern das Kommando aufruft, das man angibt. Mal als Beispiel (Als Prompt wähle ich den UNIX-Standardprompt $, auch wenn SuSE da ein > nach Geraffele nimmt) $ ls -s /etc Wenn man sowas eingibt (das $ nicht, das soll der Prompt sein) dann ruft die shell den Befehl ls mit zwei Argumente auf, nämlich -s und /etc ls weiß damit was anzufangen, nämlich zum einen, daß es wegen des -s noch an jeder Datei die Größe mit ausgibt und zum anderen daß es die Dateien, die im Verzeichnis /etc stehen ausgeben soll. Jetzt mal angenommen, Du hast im Arbeitsverzeichnis ein Verzeichnis Test Verzeichnis Also mit Leerzeichen im Namen. Wen Du nun folgendes eingibst: $ ls Test Verzeichnis so ruft die shell den Befehl ls mit zwei Argumenten auf, einmal mit Test und zum anderen mit dem Argumenten Verzeichnis. Das sind beides keine Options. Also interpretiert ls beide Argumente als Dateinamen. Wenn es sowohl eine Datei oder Verzeichnis Test als auch Verzeichnis gibt, so gibt ls dies aus. Wenn es beide nicht gibt, so gibt es eine Fehlermeldung. In jedem Fall aber ist es nicht das, was man will, denn man will ja den Inhalt des Verzeichnisses Test Verzeichnis. Was also ist zu machen? Man muß das Leerzeichen, das die shell als Ternner zwischen den Argumenten interpretiert, maskieren. Das geht mit einem Backslash: $ ls Test\ Verzeichnis Nun ruft die shell den Befehl ls mit nur einem Argument auf, nämlich mit dem Argument Test Verzeichnis Man beachte, daß in dem Argument der Backslash \ nicht mehr vorkommt. ls sieht somit den Backslash nicht, und das ist auch gut so. Denn das Verzeichnis heißt ja Test Verzeichnis und nicht Test\ Verzeichnis. ls sieht wieder, daß Test Verzeichnis keine Option ist und gibt den Inhalt dieses Verzeichnisses aus, so wie gewünscht. Nun ist das mit den Backslashes etwas umständlich, wenn man mehere Leerzeichen hat. Daher gibt es noch andere Möglichkeiten: $ ls "Test Verzeichnis" Hier wird auch wieder der Befehl ls mit dem einen Argument Test Verzeichnis aufgerufen, also ganz genau wie im Beispiel davor. Es gibt mithin keinen Unterschied für ls. Eine weitere Möglichkeit wäre: $ ls 'Test Verzeichnis' Auch hier passiert genau das Gleiche. (Bitte ' nicht mit ` verwechseln, denn ` macht tatsächlich was völlig anderes als ') Sicherlich wußtest Du schon, was " und ' machen, aber wichtig ist zu sehen, was die shell macht, und was der Befehl. Ganz klar erkennt man das an Folgendem: $ ls foo* Hier ersetzt die shell den * mit allen Dateien und Verzeichnisse, die im aktuellen Verzeichnis stehen und mit foo beginnen. Angenommen dies sind foo, foobar und foobaz, dann macht die shell aus dem foo* folgendes: foo foobar foobaz und ruft den Befehl ls nun mit den drei Argumenten foo, foobar und foobaz auf. Es ist genauso als ob man $ ls foo foobar foobaz gesagt hätte. Der Befehl ls weiß nichts von dem * Wenn es keine Datei und kein Verzeichnis im Arbeitsverzeichnis gibt, das mit foo anfängt, so ersetzt die shell den * nicht und ls bekommt das Argument foo*. ls gibt dann eine Fehlermeldung aus, da es diese Datei ja nicht gibt. Hat man aber ein Verzeichnis das foo* heißt, also mit dem Stern, so muß man den wieder maskieren. Hier gleich alle drei Möglichkeiten: $ ls foo\* $ ls "foo*" $ ls 'foo*' in allen drei Fällen ruft die shell den Befehl ls mit dem einen Argument foo* auf. Hier erkennt ls, daß es sich nicht um eine Option handelt, und zeigt den Inhalt des Verzeichnisses foo* an. Wie auch immer ls interpretiert den * nicht. Das macht die shell, wenn ls den * von der shell durchgereicht bekommt, dann ist es für ls ein ganz normaler Bestandteil des Namens. Darum wird man in der manpage von ls auch nichts über den * finden, den ls macht damit nichts. Die manpages sind ja auch nicht nur für bash und andere shell Benutzer da, man kann ls ja etwa auch aus einem C Programm heraus aufrufen. Da kann man dann auch nicht mit * arbeiten, da muß man sich selber darum kümmern. (oder eine shell aufrufen, die das für einem macht) Wenn man das verstanden hat, dann versteht man z.B auch, warum $ mv *.old *.bak nicht funktionieren kann. Solltest Du noch Fragen haben, so frage bitte. Gilt natürlich auch für jeden anderen. Bernd -- ACK = ACKnowledge = Zustimmung | NAC = No ACknowledge = keine Zustimmung DAU = Dümmster Anzunehmender User | LOL = Laughing Out Loud = Lautes Lachen IIRC = If I Remember Correctly = Falls ich mich richtig erinnere OT = Off Topic = Am Thema (der Liste) vorbei |Zufallssignatur 11