Terminal find-Befehl Verzeichnis ausklammern

comrat

Aktives Mitglied
Thread Starter
Dabei seit
27.12.2004
Beiträge
112
Reaktionspunkte
0
Hallo,

sollten Fragen zum Terminal von MacOSX 10.3.5 hier falsch sein, bitte ich darum diesen Thread hier komplett zu löschen. Danke.

Bei der Programmierung von PHP4 habe ich immer ein Terminal daneben geöffnet um Funktionen oder globale Variablen schneller in meinen Dateien zu finden. Dateinamen, die das Wort Kopie enthalten und temporäre Dateinamen, die bei mir alle mit x beginnen, sollen bei meiner Suche nicht berücksichtigt werden. Dateien, deren Namen mit der Extension txt oder php versehen sind, sind genau diejenigen, die ich durchsuche.

find . \! -name "*Kopie*" \! -name "x*" -and \( -name "*.txt" -or -name "*.php" \) -exec grep -inr "meinsuchstring" {} \; -print

Seitdem ich den phpmyadmin aber im selben Ausgangsverzeichnis ablegen mußte, durchsuche ich auch dort abgelegte Dateien, die im Namen auf php enden. Das möchte ich normalerweise nicht. Selbst wenn wir jetzt entscheiden sollten, daß das Verzeichnis phpmyadmin verschoben werden sollte, bitte ich Euch mir bei der Lösung dieses Problems zu helfen. Da sind noch mehr, kleinere Verzeichnisse, die ich ignorieren möchte. *bei gesenktem Blick zieht der rechte Fuß "verlegen" Kreise in den Sand*

Wie muß ich meinen kompletten find-Befehl schreiben, damit ein solches Verzeichnis ignoriert wird?

Die Lösung scheinen wir in Beitrag #6 zu haben:
https://www.macuser.de/threads/terminal-find-befehl-verzeichnis-ausklammern.186995/#post-1961710

Ganz herzlichen Dank für Eure Zeit und Mühe.

Gruß
 
Zuletzt bearbeitet:
mach doch ein einfach ein "grep -v verzeichnisname" hinter das find...
dann schmeisst grep das raus...
 
Bitte komplett Befehl angeben

Ich weiß, es klingt dreist, aber wie muß dann der gesamte Befehl aussehen? Entschuldige, als ich nach vielen Jahren wieder mit unix anfing, brauchte ich für meinen oben angegebenen Feind, äh, find sehr lange, bis ich alle erforderlichen Parameter wieder zusammen hatte und dann auch noch herausgefunden hatte, daß einige der Leerzeichen zwingend sind. aaaarrgh ;)

Der, von Dir angegebene Parameter -v bewirkt beim grep laut Manual man, daß die Suche invertiert interpretiert wird. Wolltest Du wirklich darauf hinaus?

Ich möchte alles durchsuchen, das am aktuellen Verzeichnis "." dranhängt, nur eben ein oder zwei bestimmte Unterverzeichnisse nicht. Leider habe ich keinen Fachbegriff für diese Vorgehensweise, um die Suche selber abschließen zu können, was ich sehr gerne täte. :(

Danke und Gruß
 
Zuletzt bearbeitet:
du nimmst einfach dein find von oben und pappst ein "| grep -v verzeichnisname" dahinter, dann gibt grep alles aus bis auf sachen wo verzeichnisname mit drin ist...
 
Verzeichnis wird durch, Trefferzeilen mit seinem Namen aber gelöscht

Habe ich jetzt gemacht, ungläubig zwar, aber mutig vorangestürmt ;)

So sieht es normalerweise aus:

Code:
ComRats-Computer:~/Documents/p00/p44/p44_ comrat$ find . \! -name "*Kopie*" \! -name "x*" -and \( -name "*.txt" -or -name "*.php" \) -exec grep -inr "function.*print.*prev" {} \; -print
201:    function print_navigation_prev($name_of_this_page) {
./php4/include_navigation.php
261:    function printPreview() {
./phpmyadmin/libraries/Theme.class.php
338:    function printPreviews()
./phpmyadmin/libraries/Theme_Manager.class.php
ComRats-Computer:~/Documents/p00/p44/p44_ comrat$

So sieht es, ergänzt um Deinen Vorschlag, aus:

Code:
ComRats-Computer:~/Documents/p00/p44/p44_ comrat$ find . \! -name "*Kopie*" \! -name "x*" -and \( -name "*.txt" -or -name "*.php" \) -exec grep -inr "function.*print.*prev" {} \; -print | grep -v phpmyadmin
201:    function print_navigation_prev($name_of_this_page) {
./php4/include_navigation.php
261:    function printPreview() {
338:    function printPreviews()
ComRats-Computer:~/Documents/p00/p44/p44_ comrat$

Scheinbar wurden nur die gefundenen Zeilen, die den Verzeichnisnamen enthalten ausgeklammert. Bei der Suche sollte das Verzeichnis aber gar nicht erst durchsucht werden. Und nun? ;) Muß nicht der find eine Erweiterung seiner Parameter erfahren?

Danke und Gruß
*blättert Handbücher*
 
Zuletzt bearbeitet:
Lösung gefunden?

Hallo,

ich glaube ich habe die Lösung jetzt doch gefunden:

Code:
find . \! -path './phpmyadmi*' \! -name "*Kopie*" \! -name "x*" -and \( -name "*.txt" -or -name "*.php" \) -exec grep -inr "function.*print.*prev" {} \; -print
201:    function print_navigation_prev($name_of_this_page) {
./php4/include_navigation.php

Ergänze ich den Befehl find um den Parameter -path dann durchsucht er nur die Verzeichnisse die der Angabe im path-String entsprechen. Mit \! negiere ich diese Bedingung, ergo werden alle Unterverzeichnisse durchsucht, nur die nicht, die mit diesem String im Verzeichnisnamen beginnen.

Ausschnitt des Befehls:
Code:
\! -path './phpmyadmin*'

Sollte ich mich irren, bin ich für jeden konstruktiven Hinweis dankbar.

Der Ansatz von oneOeight scheint auch sehr gut zu sein, allerdings müßte dazu jeder gefundene Zeileninhalt mit dem relativen Pfad beginnen, oder? Wie man diesen zusätzlich zur Zeilennummer ausgibt, ist mir im Moment nicht geläufig. Danke, oneOeight.

Gruß
 
Zuletzt bearbeitet:
comrat schrieb:
Sollte ich mich irren, bin ich für jeden konstruktiven Hinweis dankbar.

Ein 'exclude' würde ich eher so

Code:
find . -path './Home' -prune -o -print

realisieren. Die Geschichte mit dem grep finde ich deswegen nicht ganz optimal, da Du damit nicht mehr unterscheiden kannst, ob Du nun einen Verzeichnisnamen oder irgendeinen anderen Bestandteil des Pfades entfernst.

Gruß, Denny
 
In der Z Shell könnte man auf das 'find' vollständig verzichten und das auswählen der gewünschten Dateien komplett über das globbing der Shell realisieren.
Allerdings muss man auch hier eine wenig Mühe auf die Zusammenstellung der entsprechenden Syntax verwenden.
 
Zurück
Oben Unten