나는 다음의 다양한 변형을 시도했지만 아무것도 작동하지 않는 것 같습니다. 기본적으로 find
실행되면 아무 일도 일어나지 않는 것 같습니다. 아래에는 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 "$@"
}