Ordnersuche via Terminal unter Ausschluss bestimmter Ordner

tiftich

Mitglied
Thread Starter
Dabei seit
23.01.2019
Beiträge
57
Reaktionspunkte
3
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: 235
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.
 
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.
 
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…
 
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…
 
den oder vergleich in klammer setzen, damit der zuerst evaluiert wird?
 
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…?
 
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…
 
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.
 
ja, scho' klar… so geht's natürlich auch:
Code:
find . -type d \( -name '*.[a-z]*' -prune -o -print \)
 
oder so:
Code:
find . -type d -name '*.?*' -prune -or -type d -print
 
Zurück
Oben Unten