Ist es möglich, nach einer Verzeichnis- / Dateikombination zu suchen?

12

Ich muss ein Bild finden, z. B. ABC.jpg, von dem ich weiß, dass es programmgesteuert in einem Verzeichnis mit dem Namen ABC_MPSC abgelegt wurde. Ich habe es versucht:

cd /
find . -name "ABC_MPSC/ABC.jpg"

Aber das gibt nichts zurück (ich weiß tatsächlich, wo genau ich suche, also weiß ich, dass es existiert). Gibt es einen Suchbefehl, mit dem ich möglicherweise nicht manuell suchen muss?

Hmmm
quelle
2
Sie können es auch mit finden locate, was deutlich schneller sein sollte, aber nur funktioniert, wenn die Datei bereits vorhanden war, als sie updatedbdas letzte Mal ausgeführt wurde.
Simon Richter

Antworten:

17

Es gibt ein -pathPrädikat, das hier nützlich ist:

find . -path '*/ABC_MPSC/ABC.jpg'

Die POSIX- Beschreibung für dieses Prädikat lautet:

Die Primärdatenbank wird als wahr bewertet, wenn der aktuelle Pfadname mit dem Muster übereinstimmt, wobei die unter Musterübereinstimmungsnotation beschriebene Musterübereinstimmungsnotation verwendet wird. Die zusätzlichen Regeln in Muster, die für die Dateinamenerweiterung verwendet werden, gelten nicht, da dies eine Übereinstimmungsoperation und keine Erweiterung ist.

Der Grund, warum Ihr Fehler -name "ABC_MPSC/ABC.jpg"aufgetreten ist, ist das -namePrädikat:

soll als wahr gewertet werden, wenn der Basisname des aktuellen Pfadnamens mit dem Muster übereinstimmt

Mit anderen Worten, es wird -namenie das Verzeichnis des aktuellen Dateinamens angezeigt, sondern nur der Basisdateiname selbst (z. B. ABC.jpg).

Jeff Schaller
quelle
10

Zwei Möglichkeiten (abgesehen von der Verwendung-path ):

  1. Suchen Sie nach dem Verzeichnis und suchen Sie die Datei:

    find / -type d -name 'ABC_MPSC' -exec test -f {}/ABC.jpg \; -print
    

    Dies hängt von der findImplementierung ab, um {}auf den aktuellen Pfadnamen des gefundenen Verzeichnisses zu expandieren , auch wenn es mit verknüpft ist /ABC.jpg(dies ist nicht erforderlich ). Es könnte auch so geschrieben werden

    find / -type d -name 'ABC_MPSC' \
        -exec sh -c 'test -f "$1"/ABC.jpg' sh {} \; -print
    
  2. Suchen Sie nach der Datei und überprüfen Sie den Namen des übergeordneten Verzeichnisses:

    find / -type f -name 'ABC.jpg' -exec sh -c '
        case $(dirname "$1") in
            */ABC_MPSC) exit 0 ;;
            *) exit 1
        esac' sh {} \; -print
    

Diese beiden Alternativen wären langsamer als die Verwendung -path, wie Jeff zeigt. Ich lasse sie trotzdem hier als Beispiele, da sie möglicherweise für andere Dinge angepasst werden könnten.

Kusalananda
quelle