Find-Befehl im Skript einen Parameter übergeben

  • Hallo zusammen,
    ich habe lange überlegt, eine so banale Frage hier überhaupt zu stellen, aber ich kriege es einfach nicht hin.
    Ich habe einen Raspberry Pi 2, auf dem Raspbian Jessie lite läuft. Ich arbeite über eine normale SSH-Putty-Verbindung.

    Nun zu meinem Problem: Ich will nach Dateien auf dem PI suchen.
    Also zum Beispiel sollen alle Dateien gefunden werden, die im Wurzelverzeichnis von root liegen und in dessen
    Unterverzeichnissen. So sollen alle Dateien aufgelistet werden, in deren Dateinamen z.B. 'test' vorkommt, also: test, test1,
    atest, test.log, atest2.log usw.

    Das lässt sich in der Bash einfach lösen mit find / -iname "*test*".

    Jetzt möchte ich diesen find-Befehl in einem bash-Skript ausführen, dem ich den Suchstring, hier also *test* als
    Parameter übergebe. Das Skript soll den Namen ff wie filefind haben.
    Aufruf also mit ./ff *test*

    Mein Skript könnte also so aussehen:
    #!/bin/bash
    find / -iname $1

    Es ist unvorstellbar, welche und wieviele Kombinationen ich schon ausprobiert habe mit "*" '*' \ ' {} * und dergleichen.
    Nichts gelingt.

    Was mache ich falsch, geht das überhaupt, was ich vorhabe? In der bash ohne Skript funzt der find-Befehl doch auch.

    Danke vorab für Eure Antworten,
    Ulli

  • Das Problem hierbei wird vermutlich der Aufruf des Scripts sein. Mach es einfach so das du die * erst im Script setzt
    Escape dann einfach das letzte *. Dadurch wird es von $1 getrennt und gehört nicht mehr zur Variable

    Bash
    #!/bin/bash
    
    
    find / -iname *$1\*

    Fertig :cool:

    PS: Was für dich vllt auch praktisch wäre, dafür einfach ein alias erzeugen dann brauchst du kein extra Script. Siehe dazu FAQ --> Nützliche Links / Linksammlung --> Tipps & Tricks für die Konsole

  • Guten Abend zusammen,
    ich bin gestern nicht mehr dazu gekommen, Eure Vorschläge auszuprobieren, habe ich jetzt nachgeholt.

    Mit dem Ergebnis, dass ich mit dem Vorschlag von meigrafd meinem Ziel schon näher gekommen in als mit meinem eigenen Geschreibsel,
    aber noch nicht am Ziel bin. Wenn Ihr bereit wärt, nochmal mein Problem zu betrachten, so soll das Ergebnis aussehen:

    ./ff test
    -> Es wird z.B. gefunden: test, Test, TEST. Aber nicht test1, test2, atest, test.log usw.

    ./ff test*
    -> Es wird gefunden: test, Test, test1, testa, test.log, test.ini usw, aber nicht aatest, rndtest, 123test usw.

    ./ff *test
    -> es wird gefunden: test, Test, atest, BTest, hallotest, 123Test, aber nicht test22, test.log, atest55, test.ini uws.

    ./ff *test*
    -> Es wird alles gefunden, wo an irgendeiner Stelle des Dateinamens 'test' vorkommt, egal ob groß oder klein geschrieben,
    egal, was vor und hinter dem #test' steht.

    Wenn ich die Befehle, so wir ihr schreibt, in der bash eingebe, klappt das auch hervorragend, also zu den vier Beispielen oben wie folgt passend:
    find -iname "test"
    find -iname "test*"
    find -iname "*test"
    find -iname "*test*"

    Aber eben nicht, wenn ich den Suchbegriff meinem Skript ff übergebe und dann im Skript über die $1-Variable auswerte.


    So, das ist es, mein Problem. Ich weiß, ihr habt sonst mit viel ernsthafteren Probs zu tun, aber ich komme hier echt nicht weiter.
    Ich hoffe, ihr könnt euch das noch einmal ansehen und mir helfen, danke vorab,
    Ulli

  • Was genau sind denn Deine Anforderungen? :s

    Du möchtest unbedingt * als Parameter ans Script übergeben? Also nicht hardcoded im Script selbst eingefügt haben sondern nur bei Bedarf, also nur wenn du nach *test* suchst, ans Script übergeben ansonsten soll es nur nach test suchen?

    • ./ff *test* ... alles mit 1test , test2 usw finden
    • ./ff test ... alles mit 1test , test2 usw finden
    • ./ff test* ... alles mit test2 , testbla usw finden

    Evtl. wäre es einfacher nicht * zu verwenden sondern ein anderes Zeichen wie zum Beispiel % und im Script behandelst du das dann entsprechend:

  • Hei Meigrafd,
    Du hast es richtig erkannt und in einem Satz gesagt, wofür ich eine Seite brauchte.
    Ich möchte den * tatsächlich nicht hardcoded im Skript verankert haben, sondern nur bei Bedarf dem Suchwort vorne oder hinten dranhängen und entsprechend suchen.
    Ob ich jetzt als Wildcard ein * oder % oder # oder + eingeben muss, ist glaube ich egal.

    Ich werd Deinen Vorschlag gleich mal testen.
    Automatisch zusammengefügt:
    Wow
    Ich bin sprachlos, es klappt. Genauso habe ich mir das vorgestellt. Ich werde wohl noch lange brauchen, bis ich auf so Lösungen selber komme,
    aber ich habe Zeit und werde Dein Skript Buchstabe um Buchstabe zerpflücken um zu verstehen, wie es funktioniert.
    Nochmals vielen Danke für Deine Hilfe und Geduld.

    Ulli

    Einmal editiert, zuletzt von rapsi001 (28. Januar 2016 um 20:47)

  • aber ich habe Zeit und werde Dein Skript Buchstabe um Buchstabe zerpflücken um zu verstehen, wie es funktioniert.

    Code
    MASK=$1


    Das erste ans Script übergebene Parameter/Argument der Variablen "MASK" zuweisen.

    Code
    [ -z "$MASK" ] && echo "Usage: $(basename $0) <mask>" && exit 1


    Prüfen ob die Variable "MASK" nicht gesetzt, oder leer ist. Falls das der Fall ist wird die Echo Zeile ausgegeben und das Script mit exit-code 1 beendet (höher 0 bedeutet immer irgendwie "fehlerhaft").
    Das ist im Prinzip eine verkürzte if Abfrage, nur ohne "if", "then", "else" und "fi". Die && fungieren dabei als "wenn Bedingung zutrifft" beziehungsweise "wenn vorheriger Befehl erfolgreich war". || wäre die Negierung also "wenn nicht zutrifft oder nicht erfolgreich".

    Code
    MASK=${MASK//%/*}


    Alle "%" Zeichen in der Variable "MASK" durch * ersetzen und Rückgabe in Variable "MASK" schreiben. Siehe dazu Substring Replacement => http://tldp.org/LDP/abs/html/string-manipulation.html

    ..und der Rest sollte klar sein :fies:

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!