* Jürgen Hein schrieb am 14.Nov.2002:
Am Dienstag, 12. November 2002 20:31 schrieb Bernd Brodesser:
Also mußt Du was aufteilen. Es gibt verschiedene Möglichkeiten, etwa:
find . -type f -exec grep -H SUCHWORT {} \;
...jou! Genau das war's, äh, bzw. damit habe ich's nun 'immerhin' schon mal geschafft, die Dateinamen auf den Bildschirm zu bekommen. Aber!, von wegen "Zusatzfrage": Wie kann ich diesen Befehl jetzt noch erweitern, die Dateien auch gleich in ein anderes Verzeichnis verschoben oder 'wenigstens' kopiert zu kriegen?? Hab's mit 'ner Pipe, also | cp -a /path noch hintendran, probiert, geht aber leider nicht. :-(
Nein, cp ließt nicht von der Standardeingabe. Die Pipe | macht ja nichts anderes, als die Standardausgabe des einen Befehls zur Standardeingabe des nächsten zu machen, aber cp ignoriert die Standardeingabe, es kann somit nichts daraus werden. Wenn Du da noch eine Aktion machen willst, so kannst Du das mit find machen. Dazu mußt Du verstehen, wie find vorgeht. Laßen wir dazu mal -o bzw. -or das oder von find beiseite. Ein typischer find Befehl könnte so aussehen: find . -type f ! -user root -size +2k -mtime +3 Es werden alle Dateien im aktuellen Verzeichnis oder eines der Unterverzeichnisse gesucht, wegen des . Anstelle des . könnte jedes andere Verzeichnis stehen. Der . steht aber für das aktuelle Verzeichnis. Jetzt wird jede Datei durch diese Kette geschleust. Zuerst wird der Typ überprüft. Nur reguläre Dateien werden durchgelassen, also keine Verzeichnisse, keien Gerätedateien, keine FIFOs. Das macht das -type f Als nächstes wird der User überprüft. Das ! davor ist die Negation. Es werden nur Dateien weitergeführt, die nicht root gehören. Als nächstes nur Dateien, die größer sind als 2k und schließlich solche, die zuletzt vor mehr als drei Tagen verändert wurden. Dabei sind keien Kalendertage gemeint, sondern 24 Stunden, oder 1440 Minuten, oder 86400 Sekunden seit jetzt. Hier natürlich alles mal 3 ;) Nur eine Datei, die das alles erfüllt, wird am Ende angezeigt. Eine Datei, die ein Kriterium nicht erfüllt, wird vorher ausgesondert, und das nächste Kriterium wird erst gar nicht mehr überprüft. Das kanst Du mit zwichengestreuten -print, oder besser -printf überprüfen. Wenn in der Kette ein -exec auftaucht, so wird das hier angegebene Kommando ausgeführt. Das Kommando wird mit einem ; beendet. Allerdings interpretiert die shell, die das ganze ja interpretiert das ; deshalb muß es geschützt werden. Würdest Du find nicht von der shell aus aufrufen, sondern etwa aus einem C-Programm heraus, so müßte da zwar immer noch ein ; stehen, aber kein \ davor. Innerhalb des -exec ... ; wird ein auftretendes {} durch den Dateinamen ersetzt. Das wird ja z.B mit dem grep gemacht. Aber so ein -exec dient nicht nur der Ausgabe, sondern auch der Flußkontrolle. Jeder Befehl hat ein Rückgabewert, auch Exitstatus genannt. Es ist ein Integerwert. Es wird 0 als wahr und alles andere als falsch interpretiert. Speziell bei grep ist es so, daß grep eine 0 zurückgibt, wenn es was gefunden hat, eine 1 wenn es nichts gefunden hat, und eine 2, wenn ein Syntaxfehler vorlag. Das heißt, wenn nach dem -exec grep ... \; noch was anderes im find kommt, dann wird das nur ausgeführt, wenn grep erfolgreich war. Etwa so: find -type f -exec grep -q {} \; -exec cp {} NEUES_VERZEICHNIS \; Das -q im grep Befehl bewirkt, daß überhaupt keine Ausgabe gemacht wird, es kommt nur auf dem Exitstatus an. Aber nur, wenn was gefunden wurde, geht es weiter und es kommt zum nächsten -exec und hier wird kopiert. Wenn Du statt des cp ein mv schreibst, dann wird nicht kopiert, sondern verschoben. Aber da wäre ich erstmal vorsichtig mit, wenn die Dateien weg sind, sind sie weg. Allerdings werden hier sehr viele Prozesse gestartet, und das kann alles sehr lange dauern. Man könnte auch mit xargs arbeiten, aber dann hast Du wieder das Problem mit überlangen Zeilen. Bernd -- Alle meine Signaturen sind rein zufällig und haben nichts mit dem Text oder dem Schreiber zu tun, dem ich antworte. Falls irgendwelche Unrichtigkeiten dabei sein sollten, so bedauere ich das. Es wäre nett, wenn Du mich benachrichtigen würdest. |Zufallssignatur 0