Problem mit „Find“ und Variablen

Problem mit „Find“ und Variablen

Ich habe verschiedene Varianten des Folgenden ausprobiert, aber nichts scheint zu funktionieren. Im Grunde findscheint bei der Ausführung nichts zu passieren. Unten präsentiere ich meinen Bash-Funktionscode und meine Ausgabe, wenn ich ihn ausführe.

Ich möchte verstehen, was mit dem folgenden Code passiert und warum er sich nicht so verhält, als wenn ich den Befehl explizit eingebe.

rgrepAußerdem wurde mir gesagt, dass ich auf einige Boxen, an denen ich arbeite, keinen Zugriff habe. Deshalb versuche ich diesen Ansatz als allgemeine Lösung zum Suchen nach Code usw.

function findin() {

if [ -z $1 ] ; then

    echo "Usage: findin <file pattern> <<grep arguments>>"
    return 1

fi

fIn[1]=$1

shift
fIn[2]="$@"

echo -- "${fIn[1]}"
echo -- "'${fIn[2]}'"

find -type f -name "'${fIn[1]}'" -print0 | xargs -0 grep --color=auto ${fIn[2]}
}

Und die Ausgabe ist:

$ ls
Server.tcl  Server.tcl~  test.cfg  vimLearning.txt
$ find -type f -name '*.txt' -print0 | xargs -0 grep --color=auto char
x      deletes char under cursor. NNx deletes NN chars to RHS of cursor.
r      type r and the next char you type will replace the char under the cursor.
$ findin '*.txt' char
-- *.txt
-- 'char'

Antwort1

Das Muster, das Sie wahrscheinlich verwenden wollten, war *.txt, aber Sie sagen, find -nameSie sollen , einschließlich der einfachen Anführungszeichen, verwenden '*.txt', was auf keine Dateien zutrifft. Die Erweiterung funktioniert wie folgt:

Auf der Kommandozeile, wenn Sie

$ find -name '*.txt'

Ihre Shell sieht '*.txt', dass es in Anführungszeichen steht, also entfernt sie die Anführungszeichen und übergibt den Inhalt , *.txtan find.

In der Funktion,

find -name "'$var'"

die Shell erweitert $varzu *.txt. Da die Erweiterung innerhalb von Anführungszeichen erfolgte, entfernt die Shell die Anführungszeichen und übergibt den Inhalt , '*.txt'an find.

Die Lösung ist einfach: Entfernen Sie die einfachen Anführungszeichen in find -name "'$var'".


Ich habe deine Funktion für dich überarbeitet:

findin () {
    if (( $# < 2 )); then
        >&2 echo "Usage: findin <file pattern> <grep arguments ...>"
        return 1    
    fi               
    pattern=$1               
    shift
    printf '%s\n' "-- ${pattern}"
    printf '%s ' "-- $@"
    echo
    find -type f -name "${pattern}" -print0 | 
            xargs -0 grep --color=auto "$@"
}     

verwandte Informationen