今天令我疯狂的新事物:
使用以下文字创建文件:
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个命令没有工作?
答案 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
。