Linux: Erstes Ergebnis aus dem angegebenen Suchpfad finden

1297
Kevin A. Naudé

Wenn ich eine durch Doppelpunkt getrennte Pfadliste habe, ähnlich wie $ PATH, aber nicht notwendigerweise $ PATH.

Ich möchte diese Liste nach einem bestimmten Dateinamen durchsuchen. Ich möchte jedoch nur den ersten passenden Pfad.

Ich habe die folgenden Linux-Befehle betrachtet:

  • which: funktioniert nur für Binärdateien und nur mit der $ PATH-Variablen
  • whereis: funktioniert mit bestimmten Arten von Dateien und funktioniert nur mit der $ PATH-Variablen
  • find: unterstützt keine durch Doppelpunkte getrennten Pfadlisten und gibt mehrere Ergebnisse zurück

Hier sind einige Dinge, die ich ausprobiert habe:

  1. Ich habe versucht, whereisdie folgende Strategie anzuwenden

    env WHEREIS="`which whereis`" PATH="$MY_PATH_LIST" $WHEREIS "$TARGET_FILE" 

    und das funktioniert fast. Es scheint jedoch keine Ergebnisse für beliebige Dateitypen zurückzugeben. Es gibt auch mehrere Ergebnisse in einem umständlichen Format zurück.

  2. Ich könnte mich whichan die Arbeit machen

    env WHICH="`which which`" PATH="$MY_PATH_LIST" $WHICH "$MY_TARGET_FILE" 

    Wenn es eine Befehlszeilenoption gab, die es erzwingt, nicht ausführbare Dateien zuzulassen.

  3. Ich habe dann versucht das Problem mit zu lösen find. Zuerst habe ich reguläre Ausdrücke verwendet, um die Pfadliste zu erweitern (ich ersetze Doppelpunkte durch Leerzeichen). Dann rufe ich find auf und es funktioniert korrekt. Es werden jedoch alle Pfade durchsucht. Ich kann anscheinend keine Möglichkeit finden, die Suche frühzeitig zu stoppen, wenn ein gutes Ergebnis gefunden wird.

    Ich habe das zum Laufen gebracht

     find $ -name "$MY_TARGET_FILE" | head -n 1 

    Es dauert jedoch lange, bis der Vorgang abgeschlossen ist, da findimmer noch eine erschöpfende Suche durchgeführt wird.

    Ich brauche dies, um schneller auszuführen (beim ersten Ergebnis zu beenden), da es viele Male mit verschiedenen Parametern ausgeführt würde.

Hat jemand eine bessere Lösung vorzuschlagen?

Wenn alles fehlschlägt, kann ich eine Nicht-Bash-Lösung schreiben. Schreiben Sie jetzt Ich hoffe auf eine einfache Lösung mit vorhandenen Tools.

5

2 Antworten auf die Frage

3
Daniel Beck

You could just use a script that simply tests (-e) for existence of a file and stops when the first one has been found:

#!/bin/bash [[ $# -gt 0 ]] || { echo "Usage: $0 <filename> [pathspec]" >&2 ; exit 1 ; } if [[ $# -gt 1 ]] ; then P="$2" else P="$PATH" fi IFS=: for DIR in $P ; do if [[ -e "$DIR/$1" ]] ; then echo "$DIR/$1" exit 0 fi done 

Example:

$ ./search.sh Usage: ./search.sh <filename> [pathspec] $ ./search.sh ls /Users/danielbeck/bin/ls $ ./search.sh pwd /bin/pwd $ ./search.sh ls /bin /bin/ls $ ./search.sh ls /usr/bin:/bin /bin/ls 
Danke, Daniel. Das funktioniert. Ich bin überrascht, dass es für diesen Zweck keinen integrierten Befehl gibt. Ich werde ein wenig warten, um zu sehen, ob es interessante Kommentare gibt. Bisher sieht es so aus, als würde dieser zu Ihnen gehen. :-) Kevin A. Naudé vor 11 Jahren 0
0
dpatru

Verwenden Sie head, um das erste Ergebnis des Suchbefehls zu erhalten.

find `echo colon:separated:directories | sed 's/:/ /g'` -name filename | head -n1 

Oder in einer Funktion:

$ function findin { find `echo $1 | sed 's/:/ /g'` -name $2 | head -n1; } $ findin this:that:other filename