bash find找不到包含下划线的文本

时间:2016-10-18 00:12:16

标签: bash macos grep find

今天令我疯狂的新事物:

使用以下文字创建文件:

get_modal_file_name_from_service
get_modal_file_name_from
get_modal_file_name
get_modal_file
get_modal

将其命名为foo.py

然后按顺序尝试这些命令:

find . -type f -name "*.py" | xargs -Ifile grep -nH "get_modal_file_name_from" file
find . -type f -name "*.py" | xargs -Ifile grep -nH "get_modal_file_name" file
find . -type f -name "*.py" | xargs -Ifile grep -nH "get_modal_file" file

但这有效:

find . -type f -name "*.py" | xargs -Ifile grep -nH "get_modal" file

跆拳道?为什么前3个命令没有工作?

1 个答案:

答案 0 :(得分:3)

问题,简而言之

这与下划线无关。

你的问题是System.Runtime.InteropServices.Marshal.ReleaseComObject(StorageInterface); ,因为GNU xargs替换了用-Ifile指定的sigil,即使它在较大的参数中作为子字符串存在。

解决方案,详情

使用您要搜索的名称中不存在的印记 - 或者更好,不要使用-I

xargs -I

问题,详情

用一个具体的例子来解释 - 假设您正在运行此命令,并且有一个名为# BEST: find ... -exec ... {} + # (uses modern POSIX find features) find . -type f -name "*.py" -exec grep -nH "get_modal_file_name_from" '{}' + # GOOD: find ... -print0 | xargs -0 ... # (just as correct as BEST, but with more startup overhead and not POSIX-compliant) find . -type f -name "*.py" -print0 | xargs -0 grep -nH "get_modal_file_name_from" # NOT-SO-GOOD: find ... | xargs -I{} ... {} # (fixes the problem if there's no {} in your search string, but has other bugs) find . -type f -name "*.py" | xargs -I'{}' grep -nH "get_modal_file_name_from" '{}' 的文件:

./hello.py

实际调用的GNU # original, broken command find . -type f -name "*.py" | xargs -Ifile grep -nH "get_modal_file_name_from" file 是:

xargs

...发现的名称不仅替代了作为自己的参数传递的grep -nH get_modal_./hello.py_name_from ./hello.py 实例,还替换了字符串file中的file