Ich habe verschiedene Varianten des Folgenden ausprobiert, aber nichts scheint zu funktionieren. Im Grunde find
scheint 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.
rgrep
Auß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 -name
Sie 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 , *.txt
an find
.
In der Funktion,
find -name "'$var'"
die Shell erweitert $var
zu *.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 "$@"
}