Ordnersuche via Terminal unter Ausschluss bestimmter Ordner

tiftich

Neues Mitglied
Thread Starter
Registriert
23.01.2019
Beiträge
22
Ich möchte von einem Root-Verzeichnis aus nur alle Ordner finden. Bedingung ist, Ordner mit bestimmten Namen in den Resultaten nicht zu berücksichtigen. Soweit kein Problem.
Die Schwierigkeiten beginnen, sobald der Orderpfad eine Extension hat, also Plug-ins, Frameworks (.frameworks), Programme (.app) etc. Ich möchte in meinen Resultaten nämlich nur "echte" Finder-Ordner haben.

Mein Ordner "test":

Code:
ls -R
FolderBB   FolderCC.com   file       folderAA

./FolderBB:
fileBB

./FolderCC.com:
FolderDD   fileCC

./FolderCC.com/FolderDD:
fileDD
./folderAA:
fileAA


1. Finde nur Ordner. Hat einer davon irgendwas hinten mit AA im Namen, ignoriere ihn und seine Inhalte:

Code:
find . -type d \( -type d -name *AA -prune -o -print \)
.
./FolderBB
./FolderCC.com
./FolderCC.com/FolderDD

So weit, so gut. Aber jetzt:

2. Finde nur Ordner. Hat einer davon eine Extension im Namen, z.B. ".com", ignoriere ihn und seine Inhalte. Da ich nicht nur nach ".com", sondern allen vorkommenden Extensions suchen möchte, habe ich es so probiert:

Code:
find . -type d \( -type d -name '*.*' -prune -o -print \)

keine Resultate.

Code:
find . -type d \( -type d -name "*.*" -prune -o -print \)

nö.

Code:
find . -type d \( -type d -name '*.c*' -prune -o -print \)
.
./folderAA
./FolderBB

Korrekt. Aber wie kommt das? Warum wird die Angabe "*.*" nicht akzeptiert?
(Im Übrigen funktioniert auch '*.c*' statt "*.c*")

Wie muss ich einen Ordernamen, den ich mit Wildcards in der Extension suchen will, korrekt escapen?
Viele Dank für Erhellung!
 

Anhänge

  • test.jpg
    test.jpg
    25,6 KB · Aufrufe: 200

tiftich

Neues Mitglied
Thread Starter
Registriert
23.01.2019
Beiträge
22
Schade, ich dachte, das Problem bei einer Suche im Terminal zwischen Mac-Ordnern und "directory" unterscheiden zu müssen, hätte Antworten gebracht…
Eine Mac-Anwendung z.b. ist ja nichts anderes als eine directory mit der Extension "app". Und z.b. diese sollen eben ausgeschlossen werden.
 

oneOeight

Aktives Mitglied
Registriert
23.11.2004
Beiträge
58.760
Korrekt. Aber wie kommt das? Warum wird die Angabe "*.*" nicht akzeptiert?
(Im Übrigen funktioniert auch '*.c*' statt "*.c*")

Wie muss ich einen Ordernamen, den ich mit Wildcards in der Extension suchen will, korrekt escapen?

das kommt drauf an, wie das such pattern interpretiert wird.
wenn es als regex ausgewertet wird, dann steht der punkt . für ein beliebiges zeichen.
um den dann als punkt selber zu kriegen müsstest du mal \. versuchen.
 

tiftich

Neues Mitglied
Thread Starter
Registriert
23.01.2019
Beiträge
22
ja, so funktioniert es:
Code:
find . -type d -not -name '*\.*'
./folderAA
./FolderBB
./FolderCC.com/FolderDD

oder auch so:
Code:
find . -type d -not -name '*[.]*'
./folderAA
./FolderBB
./FolderCC.com/FolderDD

jetzt muss ich nur noch verhindern, dass er im Ordner "FolderCC.com" sucht.
das bisherige konstrukt mit -prune funktioniert so nämlich nicht mehr:
Code:
find . -type d \( -type d -name '*\.*' -prune -o -print \)
liefert keine Resultate…
 

tiftich

Neues Mitglied
Thread Starter
Registriert
23.01.2019
Beiträge
22
Code:
find . -type d \( -name '*.c*' -prune -o -print \)
.
./folderAA
./FolderBB
findet nur Verzeichnisse, aber solche mit "*.c*" im Dateinamen werden nicht durchsucht.

Code:
find . -type d \( -name '*.c*' -or -name '*.d*' -prune -o -print \)
.
./folderAA
./FolderBB
./FolderCC.com
./FolderCC.com/FolderDD
-prune wird erst ausgeführt, wenn die direkt vorangestellte Bedingung "’*.d*' im Dateinamen" erfüllt ist.
Daher werden Ordner mit "*.c*" im Ergebnis angezeigt, weil er die vor *.d*" findet und ausgibt.
Ich vermute also, dass -o seriell arbeitet und ich stattdessen eine Schleife/Liste brauche, die -prune abarbeitet.

Viel einfacher wäre natürlich, den Punkt irgendwo in einem Verzeichnisnamen direkt anzusprechen.
Ich krieg's aber nicht hin:

Code:
find . -type d \( -name \. -prune -o -print \)
oder
Code:
find . -type d \( -name '\.' -prune -o -print \)
oder
Code:
find . -type d \( -name '\.*' -prune -o -print \)
oder
Code:
find . -type d \( -name '*.*' -prune -o -print \)
oder
Code:
find . -type d \( -name '.*' -prune -o -print \)
findet nichts. Welche Möglichkeiten gibt es noch? grep? {}?
Sorry, oneOeight…
 

oneOeight

Aktives Mitglied
Registriert
23.11.2004
Beiträge
58.760
den oder vergleich in klammer setzen, damit der zuerst evaluiert wird?
 

tiftich

Neues Mitglied
Thread Starter
Registriert
23.01.2019
Beiträge
22
Das merkwürdige ist, dass es im "positiven" funktioniert:
Code:
find . -type d -name '*.*'
.
./FolderCC.com
OK!

Code:
find . -type d \( -name '*.*' -prune -o -print \)
liefert nichts. Egal, wie der verdammte Punkt escaped ist.
@oneOeight: eine Klammerung innerhalb der Bedingung für -type d habe ich nirgendwo in tuts oder mans gesehen.
Wie sollte die konkret aussehen und was sollte die evaluieren? -prune funktioniert doch überhaupt nur, wenn irgendein Befehl dahintersteht, so liest man es jedenfalls.

grep und regex habe ich anhand zahlreicher angeblich funktionerender Lösungen durchprobiert – funktioniert alles nicht im Kontext mit -prune

Scheint also unter BBS/OSX nicht möglich zu sein. Soll ich das glauben…?
 

oneOeight

Aktives Mitglied
Registriert
23.11.2004
Beiträge
58.760
eine Klammerung innerhalb der Bedingung für -type d habe ich nirgendwo in tuts oder mans gesehen.
Wie sollte die konkret aussehen und was sollte die evaluieren?

Code:
find . -type d \( \( -name '*.c*' -or -name '*.d*' \) -prune -o -print \)

so war das gemeint, der soll erst die oder bedingung evaluieren und dann den rest…
 

tiftich

Neues Mitglied
Thread Starter
Registriert
23.01.2019
Beiträge
22
etwas bizarr und umständlich, aber das folgende macht tatsächlich, was es soll…
Code:
find . -type d \( \( -name '*.a*' -or -name '*.b*' -or -name '*.c*' -or -name '*.d*' -or -name '*.e*' -or -name '*.f*' -or -name '*.g*' -or -name '*.h*' -or -name '*.i*' -or -name '*.j*' -or -name '*.k*' -or -name '*.l*' -or -name '*.m*' -or -name '*.n*' -or -name '*.d*' -or -name '*.o*' -or -name '*.p*' -or -name '*.q*' -or -name '*.r*' -or -name '*.s*' -or -name '*.t*' -or -name '*.u*' -or -name '*.v*' -or -name '*.x*' -or -name '*.y*' -or -name '*.z*' \) -prune -o -print \)
.
./folderAA
./FolderBB
warum es in den suchstrings einen buchstaben braucht, um dann auch wildcards zu akzeptieren, ist mir allerdings ein rätsel.
 

tiftich

Neues Mitglied
Thread Starter
Registriert
23.01.2019
Beiträge
22
ja, scho' klar… so geht's natürlich auch:
Code:
find . -type d \( -name '*.[a-z]*' -prune -o -print \)
 

Olivetti

Aktives Mitglied
Registriert
09.12.2005
Beiträge
11.697
oder so:
Code:
find . -type d -name '*.?*' -prune -or -type d -print
 

Registrierung oder Anmeldung bei MacUser.de

Du musst bei uns Mitglied sein, um einen Beitrag schreiben zu können.

Benutzerkonto erstellen

Erstelle ein kostenloses Benutzerkonto für Macuser.de

Log in

Besitzt du schon ein Benutzerkonto? Hier anmelden.

Oben