Я пробовал разные варианты следующего, но ничего не работает. В основном, когда find
gets выполняется, ничего не происходит. Ниже я представляю свой код функции bash и мой вывод при ее запуске.
Мне интересно понять, что происходит с приведенным ниже кодом и почему он ведет себя не так, как если бы я ввел команду явно.
Мне также сказали, что у меня не будет доступа к rgrep
некоторым ящикам, над которыми я буду работать, поэтому я пробую этот подход в качестве универсального решения для поиска кода и т. д.
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]}
}
И вот что получается:
$ 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'
решение1
Шаблон, который вы, вероятно, намеревались использовать, был *.txt
, но вы говорите find -name
использовать '*.txt'
, включая одинарные кавычки, что не соответствует ни одному файлу. Расширение работает следующим образом:
В командной строке, когда вы печатаете
$ find -name '*.txt'
ваша оболочка видит, '*.txt'
что кавычки заключены в кавычки, поэтому она удаляет кавычки и передает содержимое, *.txt
, в find
.
В функции,
find -name "'$var'"
оболочка расширяется $var
до *.txt
. Поскольку расширение произошло в двойных кавычках, оболочка удаляет двойные кавычки и передает содержимое, '*.txt'
, в find
.
Решение простое: удалите одинарные кавычки в find -name "'$var'"
.
Я подправил вашу функцию для вас:
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 "$@"
}