Wie kann ich find nur für ein Verzeichnis verwenden?

10

Dadurch wird eine große Anzahl von Dateien gefunden, die sich in verschiedenen Unterverzeichnissen von "Dropnot" befinden.

$ locate Dropnot

Kann ich nur den Verzeichnisstandort mit finden locate? (in welchem ​​Verzeichnis "Dropnot" sich befindet)

Wenn Dropnotalso in /home/me/ist, ist dies der einzige Eintrag, der zurückgegeben wird.

Wenn ja, was ist der einfachste / kürzeste Weg?

Am besten durch eine Flagge oder ein Symbol, anstatt nach ihr zu suchen und danach zu greifen usw., aber ich würde alles als Option nehmen.

Vielleicht eine Art Dropnot $ für das Zeilenende? (hat aber nicht funktioniert).

Michael Durrant
quelle

Antworten:

5

Es gibt keine Option zum locateSuchen des ausgewählten Dateityps (z. B. Verzeichnis), aber Sie können die Syntax Ihrer Frage verwenden Dropnot$, um Zeilen zu finden, die mit enden Dropnot. Dazu müssen Sie die -eOption zum Suchen verwenden, um den regulären POSIX-Ausdruck zu aktivieren.

In diesem Fall sollten Sie verwenden:

locate -e Dropnot$

Es ist wichtig, welche Version von locate Sie haben. In meinem System (Gentoo Linux) habe ich Secure Locate:

$ locate --version
Secure Locate 3.1 - Released March 7, 2006

in dem es keine --basenameOption aus utherder Antwort gibt. Diese Option wird von GNU Locate aus dem findutils-Paket bereitgestellt:

$ ./locate --version
locate (GNU findutils) 4.4.2

Wenn Sie Regexp mit GNU Locate verwenden möchten, sollten Sie -rstattdessen switch verwenden -e.

pbm
quelle
1
ist nicht die -eOption only print entries for currently existing files?
Phuclv
10

Ich habe mlocateinstalliert. Es ist die Standardeinstellung, die von RedHat vertrieben wird, also unter Fedora, RHEL, CentOS. Vonman 1 locate

-b, --basename
       Match  only  the  base  name  against the specified patterns. This 
       is the opposite of --wholename.

Wenn Sie also ausführen locate -b '\Dropknot', werden nur Dateien oder Verzeichnisse mit genau dieser Zeichenfolge gemeldet.

Because \ is a globbing character, this disables the implicit replacement 
of NAME by *NAME*.
George M.
quelle
locate -b /Dropnotgearbeitet
Michael Durrant
4

Mit GNU-Lokalisierung (andere Lokalisierungsimplementierungen können abweichen):

locate '*/Dropnot'
locate Dropnot | grep '/Dropnot$'

Wenn das Argument keinen Platzhalter enthält, wird locatenach einem Pfad mit dem angegebenen Suchbegriff als Teilzeichenfolge gesucht. Wenn das Argument ein Shell-Muster ist, das ein oder mehrere Platzhalterzeichen enthält, wird locatenach einer vollständigen Übereinstimmung gesucht. Wenn Sie das /Dropnotam Ende nicht ausgeben möchten :

locate -0 '*/Dropnot' | xargs -0 -n1 dirname
locate Dropnot | sed -n 's:/Dropnot$::p'
Gilles 'SO - hör auf böse zu sein'
quelle
0

Wenn Sie RedHat verwenden, ist mlocate wahrscheinlich nicht Secure Locate installiert. In diesem Fall gibt es keine Option -e und Sie müssen -r oder --regexp verwenden, um mit einfachen regulären Ausdrücken zu suchen.

Jistanidiot
quelle
0

Slackware verwendet slocatestandardmäßig eine Regex-Suche mit der Option r :

locate -r '/Dropnot$'

sucht nach benannten Verzeichnissen Dropnot.

Dies würde suchen zB für nummerierte -nur DropnotVerzeichnisse (Dropnot1, Dropnot2, etc.):

locate -r '/Dropnot[[:digit:]]\+$'
Skippy le Grand Gourou
quelle
0

Ich weiß nicht, warum niemand so etwas vorgeschlagen hat:

for i in $(locate MYDIR); do [ -d "$i" ] && echo $i; done

Dadurch wird nur überprüft, ob eine der Suchzeichenfolgen ein Verzeichnis ist, und es wird gedruckt

cy8g3n
quelle