다음의 다양한 변형을 시도했지만 아무 것도 작동하지 않는 것 같습니다. 기본적으로 find
실행해도 아무 일도 일어나지 않는 것 같습니다. 아래에는 bash 함수 코드와 이를 실행할 때의 출력이 나와 있습니다.
아래 코드에서 어떤 일이 발생하는지, 명령을 명시적으로 입력할 때와 다르게 동작하는 이유가 무엇인지 알고 싶습니다.
또한 제가 작업할 일부 상자에 접근할 수 없다는 말을 들었기 rgrep
때문에 grep 코드 등에 대한 일반적인 솔루션을 얻기 위해 이 방법을 사용하려고 합니다.
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 "$@"
}