我嘗試了以下不同的變體,但似乎沒有任何效果。基本上,當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'
你的 shell 看到'*.txt'
被引用了,所以它會去掉引號並將內容 , 傳遞*.txt
給find
。
在函數中,
find -name "'$var'"
外殼擴展$var
為*.txt
.由於擴展發生在雙引號內,因此 shell 會移除雙引號並將內容 , 傳遞'*.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 "$@"
}