On Die, 03 Jun 2003 at 17:49 (+0200), Falk Sauer wrote:
Hi Philipp
Philipp Zacharias schrieb:
Wenn ich das kombiniere: find . ! -name "*file9*" -path './nottofind' -prune -o -print wirkt jedoch nur das prune, Dateien namens *file9* werden dennoch gefunden :o(.
Wie würde klein Louis Papa Hacke jetzt fragen: "...und waruuhuumm?"
du beziehst dich sicher auf die manpage von wegen expr1 -a expr2 Same as expr1 expr2 oder expr1 -and expr2, ich hab an sowas auch mal ne weile gebastelt, probier die dinger mal jew. in eine runde klammer zu stecken find (- name ...) -a ( -prune ... ) und probehalber vielelicht noch eine um beide Bedingungen.
Ansatz gut, Realisierung nicht ;-) Beim find muss man immer dran denken, dass alles, was im find ankommen soll und in der Shell eine Sonderbedeutung hat, vor dieser versteckt werden muss. Das trifft hier auf die () zu, die in der Shell eine Subshell eröffnen. Dann passiert dies: jan@k500:~> find . ! ( -type f -name x ) -print bash: syntax error near unexpected token `(' Die Und-Verknüpfung per -a oder -and ist nicht notwendig, das ist der Default (bei einer Oder-Verknüpfung ist das anders). Die Sache mit dem Pfad ist etwas komplizierter. Bei Deinem Konstrukt hanelt es sich um eine _and_ und eine _or_ Verknüpfung, die - da nicht geklammert - von links nach rechts abgearbeitet wird. Was Du willst ist folgendes: Suche ausgehend vom aktuellen Verzeichnis alle Einträge, die nicht file9 im Namen haben _oder_ im Pfad ./nottofind liegen, und zeige diese an. Du brauchst also ein -o statt des Default-and: find . -name "*file9*" -o -path './nottofind' -prune -o -print Zur besseren Übersicht kann man klammern, obwohl das in diesem Fall nicht notwendig ist (und denkt an die allmächtige Shell, die diese Klammern nicht bemerken darf): find . \( -name "*file9*" -o -path './nottofind' -prune \) -o -print Und so kann es dann aussehen: jan@k500:~/tmp/findtest> tree . |-- absfile9de |-- datei2 `-- nottofind `-- datei 1 directory, 3 files jan@k500:~/tmp/findtest> find . -name "*file9*" -o -path './nottofind' -prune -o -print . ./datei2 Andere Varianten (um Dich ein wenig zu verwirren ;-): find . ! -name "*file9*" ! -path './nottofind*' -print find . ! \( -name "*file9*" -o -path './nottofind*' \) -print find . ! -regex ".*file9.*\|\./nottofind.*" -print So, das soll erstmal reichen ;-) Jan